簡體   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