保留关键字作为 JPA 查询中的标识符

Reserved keyword as identifier in JPA query

我用这种方式定义了多个 JPA 命名查询:

SELECT group FROM FOO_Group group WHERE group.valid = :valid ORDER BY group.date

尽管 group 是 SQL 中的保留关键字,但 Hibernate 似乎从未为此烦恼。

但是,现在我必须定义一个连接两个 table 的命名查询:

SELECT group FROM FOO_User user JOIN user.group group WHERE group.valid = :valid ORDER BY group.date

这一次查询失败,Hibernate 声明预期 BY(如 GROUP BY),但找到了 WHERE

我知道使用保留关键字作为列,table或实体名称通常是个坏主意。但我想知道,为什么它没有引起任何麻烦我的旧查询,但现在在加入查询中失败了。是否有任何语法允许我在新查询中也使用 group ?我尝试了 JOIN user.group AS group,但没有达到预期效果。

现在,我能做的就是重命名标识符:

SELECT g FROM FOO_User user JOIN user.group g WHERE g.valid = :valid ORDER BY g.date

你应该区分SQL关键字JPQL/HQL保留标识符.

您可以使用 SQL quoted identifiers 作为 column/table 个名字。

但根据 JPA 规范(参见 4.4.1 标识符部分)

Reserved identifiers must not be used as identification variables or result variables (see section 4.8).

您的第一个查询是偶然成功的。 HQL语法指定here. As you can see from the HqlParser实现,group属于所谓的弱关键字(见weakKeywords()方法)。因此,第一个查询按以下方式标记化:

SELECT group               --> selectClause                
FROM FOO_Group group       --> fromClause   (FROM^ { weakKeywords(); }) ...
WHERE group.valid = :valid --> whereClause
ORDER BY group.date        --> orderByClause

但是第二个:

SELECT group             --> selectClause
FROM FOO_User user       --> fromClause FROM^ { weakKeywords(); }
JOIN user.group          ----> fromJoin ... JOIN^ (FETCH)? joinPath (asAlias)? ...
group                    --> problem !!!
WHERE group.valid = :valid
ORDER BY group.date