我这样定义了多个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