我通过这种方式定义了多个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 quoted identifiers用于列/表名。但是根据JPA规范(请参阅
4.4.1标识符
)保留的标识符您的第一个查询是偶然的。指定HQL语法here。从HqlParser实现中可以看到,不得使用作为标识变量或结果变量(请参见第4.8节)。
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