我有一个问题..为什么我重复了我在fetch方法中选择的内容。
Date minDate = getDSLContext()
.select(CON_CAL_INSTANCE.DATE.min())
.from(CON_CAL_INSTANCE)
.join(CON_CAL_TEMPLATES)
.on(CON_CAL_INSTANCE.TEMPLATE_ID.eq(CON_CAL_TEMPLATES.ID))
.where(CON_CAL_TEMPLATES.ENTRY_TYPE.in("REPT", "HRPT"))
.fetchOne(CON_CAL_INSTANCE.DATE.min());
所以我在select子句中提供了CON_CAL_INSTANCE.DATE.min()
,为什么我必须在fetchOne(CON_CAL_INSTANCE.DATE.min())
中重复它?
或者我不是这样做的吗?
答案 0 :(得分:8)
你做得对。使用Java泛型构建jOOQ DSL的方式,ResultQuery<Record1<Date>>
不“知道”它只选择一个值,即使ResultQuery
使用{{3作为行类型。
除了重复该列之外,您还有其他一些选择:
ResultQuery<Record1<Date>> query = // ...
// Use two method calls (this may result in a NullPointerException!
// as fetchOne() may return null):
Date date1 = query.fetchOne().value1();
// Use fetchValue():
Date date2 = getDSLContext().fetchValue(query);
另请参阅Record1
。
在旁注中,过去曾讨论过在jOOQ API中使用更多LINQ风格的语法:
from Table
where Predicates
select Projection
一开始看起来好主意的是提出新问题:
ORDER BY
,FOR UPDATE
条款如何,仍应放在SELECT
之后。 (DSLContext.fetchValue()
Javadoc)。UNION
,INTERSECT
和EXCEPT
。这些悬而未决的问题使我们坚持使用标准的SQL语法。