【问题标题】:JOOQ : Unable to implement Seek in Dynamic QueryJOOQ:无法在动态查询中实现搜索
【发布时间】:2015-08-21 15:49:27
【问题描述】:

我正在尝试编写一个使用seek 方法的动态查询。我使用addSeekAfter 代替seek 是有缺陷的。我如何解决它?

// my current setup
create.select(TOPIC.ID, TOPIC.DESCRIPTION)
.from(TOPIC)
.orderBy(TOPIC.MODIFIED_ON.desc(), TOPIC.ID.desc())
.seek(recModifiedOn, ULong.valueOf(recentTopicId))
.limit(noOfRecords)
.fetch()
.map(new TopicRecordMapper());

// what I want to move to
SelectQuery query = create.selectQuery();
query.addSelect(TOPIC.ID, TOPIC.DESCRIPTION);
query.addFrom(TOPIC);
query.addOrderBy(TOPIC.MODIFIED_ON.desc(), TOPIC.ID.desc());
// below addSeekAfter is not yielding identical results as above
query.addSeekAfter(
 DSL.field(TOPIC.MODIFIED_ON.le(TimeUtils.getTime(recentModifiedOn))),  
 DSL.field(TOPIC.ID.le(ULong.valueOf(recentTopicId))));
query.addLimit(noOfRecords);
query.fetch().map(new TopicRecordMapper());

【问题讨论】:

    标签: java sql jooq


    【解决方案1】:

    DSL API 提供了一个方便的方法seek(T1, T2),其中:

    .seek(value1, value2)
    

    只是这个的缩写:

    .seek(DSL.val(value1), DSL.val(value2))
    

    事实上,jOOQ 的大部分 API 都为了方便而重载,因此您不必一直使用 DSL.val() 显式创建绑定值。

    但是,“模型 API”(see the manual's section about DSL vs model API for details) 没有包含那么多便利方法。这意味着您必须显式创建绑定值。写这个:

    query.addSeekAfter(
        DSL.val(recentModifiedOn),  
        DSL.val(ULong.valueOf(recentTopicId)));
    

    For more information, please consider also looking into the manual's section about bind variables.

    【讨论】:

    • 非常感谢卢卡斯。 JOOQ 只是一个很好的实现。
    【解决方案2】:

    这似乎解决了它。方法对吗?

    Field[] topicIdArgs = new Field[]{DSL.val(ULong.valueOf(recentTopicId), ULong.class)};
    Field[] args = new Field[]{DSL.val(TimeUtils.getTime(recentModifiedOn), Timestamp.class)};
    query.addSeekAfter(DSL.function("", Timestamp.class, args), DSL.function("", ULong.class, topicIdArgs));
    

    [已编辑。看看下面 Lukas 的回答]

    【讨论】:

    • 虽然这样可行,但肯定没有必要这样做。将绑定值包装在伪函数中似乎有点矫枉过正。使用 jOOQ,通常有一种更简单的方法 :)
    猜你喜欢
    • 1970-01-01
    • 2012-12-12
    • 2018-10-05
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 2020-03-25
    相关资源
    最近更新 更多