我有这个查询:
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();
Run Code Online (Sandbox Code Playgroud)
此查询生成:
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
Run Code Online (Sandbox Code Playgroud)
执行它我得到: Column "anno_mese" not found; SQL statement
测试生成的查询并从anno_mese查询的每个部分中删除引号使查询工作。
我的查询是错误的还是我以错误的方式使用了 jooq?
这个查询中的别名不是那么重要,我可以不使用它来运行查询,但只是为了了解它是如何工作的。我使用 h2 作为数据库。
谢谢您的帮助
我怀疑这是我在此处报告的 H2 中的错误,因为查询对我来说看起来不错。以下是您可以从 jOOQ 方面执行的一些解决方法:
"anno_mese"按名称引用列虽然 SQL 有点重复,否则您不会注意到 jOOQ 的区别。我只是将as("anno_mese")方法调用移到了SELECT子句中。您在GROUP BYandORDER 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();
Run Code Online (Sandbox Code Playgroud)
您可以使用jOOQSettings来防止引用架构/表/列名称。例子:
DSLContext create = DSL.using(connection, SQLDialect.H2,
new Settings().withRenderNameStyle(RenderNameStyle.AS_IS);
Run Code Online (Sandbox Code Playgroud)
这可能会起作用: DSL.field(...).as("ANNO_MESE")
| 归档时间: |
|
| 查看次数: |
1223 次 |
| 最近记录: |