jooq - 获取单个值

13

我有一个问题.. 为什么我在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());

我在查询语句中提供了CON_CAL_INSTANCE.DATE.min(),为什么我还需要在 fetchOne(CON_CAL_INSTANCE.DATE.min()) 中重复它呢?

或者说我这样做不对吗?

1个回答

17

你做得很对。jOOQ DSL使用Java泛型构建,即使 ResultQuery 使用 Record1 作为行类型,你的 ResultQuery<Record1<Date>> 并不知道它只选择了一个值。

除了重复列之外,你还有其他一些选项:

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

另请参阅DSLContext.fetchValue() Javadoc

使用更类似于LINQ的语法

顺便提一下,过去一直在讨论是否在jOOQ API中使用更类似于LINQ的语法:

from Table
where Predicates
select Projection

一开始看起来不错的想法引发了新的问题:

  1. ORDER BYFOR UPDATE子句应该仍然放在SELECT之后,关于此详见这篇文章
  2. 关于集合运算,例如UNIONINTERSECTEXCEPT等,该怎么办。

我也写过一篇关于SQL操作的词法和逻辑顺序差异的文章。

这些问题使我们坚持使用标准的SQL语法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,