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