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



我这样定义了多个JPA命名查询:

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

尽管group是SQL中的一个保留关键字,但这似乎从未困扰过Hibernate。

然而,现在,我必须定义一个连接两个表的命名查询:

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

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

我知道使用保留关键字作为列、表或实体名称通常是个坏主意但我想知道,为什么它在我的旧查询中没有引起任何麻烦,但现在在联接查询中失败了。是否有任何语法允许我在新查询中也使用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引号的标识符。

但根据JPA规范(见4.4.1标识符一节(

保留标识符不得用作标识变量或结果变量(见第4.8节(

您的第一个查询偶然成功。这里指定了HQL语法。从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

最新更新