繁体   English   中英

JOOQ:无法在动态查询中实现搜索

[英]JOOQ : Unable to implement Seek in Dynamic Query

我正在尝试编写一个使用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());

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

.seek(value1, value2)

简而言之:

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

实际上,为了方便起见,大多数jOOQ的API都已重载,因此您不必一直使用DSL.val()显式创建绑定值。

但是,“模型API”( 有关详细信息,请参阅有关DSL与模型API的手册部分 )不包含许多便利方法。 这意味着您必须显式创建绑定值。 这样写:

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

有关更多信息,请考虑同时考虑手册中有关绑定变量的部分

这似乎解决了。 这是正确的方法吗?

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));

[编辑。 看看下面卢卡斯的答案]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM