保留关键字作为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
w476226477 回答:保留关键字作为JPA查询中的标识符

您应该区分 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
本文链接:https://www.f2er.com/2657428.html

大家都在问