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

问题描述 投票:1回答:1

我通过这种方式定义了多个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 hibernate jpa naming reserved-words
1个回答
0
投票
您应区分

SQL关键字和JPQL / HQL保留标识符

您可以将SQL quoted identifiers用于列/表名。

但是根据JPA规范(请参阅

4.4.1标识符

保留的标识符

不得使用作为标识变量或结果变量(请参见第4.8节)。

您的第一个查询是偶然的。指定HQL语法here。从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

© www.soinside.com 2019 - 2024. All rights reserved.