2015-06-06 3 views
1

Я пытаюсь написать динамический запрос, который использует метод seek. Мое использование addSeekAfter в качестве замены для seek имеет недостатки. Как это исправить?JOOQ: невозможно реализовать поиск в динамическом запросе

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

ответ

0

Это, кажется, решит проблему. Правильно ли это?

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

[Отредактировано. Посмотрите на ответ Лукаса ниже]

+0

Хотя это будет работать, это, безусловно, не нужно делать так. Обертка ваших значений привязки в псевдофункциях кажется немного похожей на излишнюю. С jOOQ обычно есть более простой способ :) –

+0

:) Спасибо. Я должен прочитать о переменных привязки – user2067095

1

Маршрутизатор DSL API предоставляет метод seek(T1, T2) удобства, где это:

.seek(value1, value2) 

чуть меньше для этого:

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

В самом деле, большинство API jOOQ является перегружены для удобства, так что вам не нужно явно создавать значения привязки, используя 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.

+0

Спасибо большое Лукасу. JOOQ - это просто отличная реализация. – user2067095

Смежные вопросы