代码之家  ›  专栏  ›  技术社区  ›  Jin Kwon

为什么我的光标为空?

  •  0
  • Jin Kwon  · 技术社区  · 7 年前

    我正在尝试使用MyBatis的光标。

    映射器XML

    <select id="selectCursor51" resultMap="someResultMap" resultOrdered="true">
        SELECT
            ...
        FROM
            ...
        <where>
            ...
        </where>
        ORDER BY
            ..., <!-- is this part can be wrong? -->
            some_id ASC
    </select>
    

    映射器接口,

    @Mapper
    public interface SomeMapper {
        List<Some> selectCursor51(...);
    }
    

    春季服务,

    @Service
    public class SomeService {
    
        @Transactional
        public <R> R some(..., final Function<Cursor<Some>, R> function) {
            ...
            final Cursor<Some> cursor = someMapper.selectCursor51(...);
            return function.apply(cursor);
        }
    
        @Autowired
        private SomeMapper someMapper;
    }
    

    实际查询生成非空结果。 但光标为空。

    我做错了什么?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Jin Kwon    7 年前

    我用最新消息来回答我自己的任务。

    这种方法实际上是有效的。

    问题是有更多的方法直接或间接调用该方法。

    @Transactional
    public <R> R some(..., final Function<Cursor<Some>, R> function) {
        return function.apply(someMapper.selectCursor51(...));
    }
    
    // not annotated with @Transactional
    public void some(..., final Consumer<Some> consumer) {
        some(
            ...,
            cursor -> {
                for(Some some: cursor) {
                    consumer.accept(some);
                }
            }
        );
    }
    

    比如说控制器,当调用带有注释的函数的some时 @Transactional 它起作用了。

    当它对使用者调用some方法时,它不会这样做。

    我发现 @Transactional method calling another method without @Transactional anotation? 解决了我的问题。