[英]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.