jOOQ - 别名和引号错误

时间:2014-09-22 13:30:15

标签: java sql h2 jooq

我有这个问题:

Field<String> yearMonth = DSL.field("FORMATDATETIME({0}, 'yyyy-MM')",
                    String.class, LICENZE.CREATION_DATE).as("anno_mese");

List<Record3<Integer, String, String>> records = 
    create.select(DSL.count().as("num_licenze"), LICENZE.EDIZIONE, yearMonth).
    from(LICENZE).
    groupBy(LICENZE.EDIZIONE, yearMonth).
    orderBy(yearMonth).
    fetch();

此查询生成:

select 
  count(*) "num_licenze", 
  "PUBLIC"."LICENZE"."EDIZIONE", 
  FORMATDATETIME("PUBLIC"."LICENZE"."CREATION_DATE", 'yyyy-MM') "anno_mese"
from "PUBLIC"."LICENZE"
group by 
  "PUBLIC"."LICENZE"."EDIZIONE", 
  "anno_mese"
order by "anno_mese" asc

执行它我得到:Column "anno_mese" not found; SQL statement

在查询的每个部分中测试生成的查询并从anno_mese中删除引号,使查询正常工作。

我的查询错了还是我以错误的方式使用jooq?

此查询中的别名不是那么重要,我可以在不使用它的情况下运行查询,只是为了理解它是如何工作的。 我使用h2作为数据库。

感谢您的帮助

1 个答案:

答案 0 :(得分:4)

I suspect this is a bug in H2, which I've reported here,因为查询对我来说很好。以下是您可以从jOOQ方面做的一些解决方法:

不要按名称

引用"anno_mese"

虽然SQL有点重复,但你不会注意到与jOOQ的区别。我只是将as("anno_mese")方法调用移到了SELECT子句中。您并非真正需要GROUP BYORDER BY条款。

Field<String> yearMonth = DSL.field("FORMATDATETIME({0}, 'yyyy-MM')",
                    String.class, LICENZE.CREATION_DATE);

List<Record3<Integer, String, String>> records = 
    create.select(DSL.count().as("num_licenze"), 
                  LICENZE.EDIZIONE, 
                  yearMonth.as("anno_mese")).
    from(LICENZE).
    groupBy(LICENZE.EDIZIONE, yearMonth).
    orderBy(yearMonth).
    fetch();

在jOOQ生成的查询中禁用引用

您可以使用jOOQ's Settings来阻止schema / table / column names from being quoted。例如:

DSLContext create = DSL.using(connection, SQLDialect.H2, 
    new Settings().withRenderNameStyle(RenderNameStyle.AS_IS);

使用大写列名称

这可能有效:DSL.field(...).as("ANNO_MESE")