如何转义 JPQL 中实体名称的保留关键字 - Hibernate

问题描述 投票:0回答:2

我有一个简单的 JOIN 查询,需要在 Table_A 和 Order 之间运行,但由于 Order 是保留关键字,我收到以下错误:

org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: Order near line 1

这是查询:

List<Tuple> list  = entityManager.createQuery(
                "select a " +
                        "from Table_A a " +
                        "join Order o on a.orderID = o.orderID " +
                        "where o.status = :status ", Tuple.class)
                .setParameter("status", "Completed")
                .getResultList();

我遇到过人们遇到类似困难的问题,但所提出的问题是列名称的问题,幸运的是,这些问题有解决方法,但当关键字是实体名称时,我无法找到解决方案。我不想因为这个障碍而更改类名,我想知道是否有人遇到过类似的问题并可以帮助我解决我的问题。

有人提出类似问题尚未得到答复,请查看此链接: 类似问题

对列名有困难的人已经通过执行以下操作解决了这个问题:

问题_1

问题_2

hibernate jpa jpql
2个回答
5
投票

您不能使用 Order 作为实体名称,因为它是 JPQL 中的保留关键字。

如果您不想更改类的名称,您可以像这样更改实体名称,其中“TheOrder”将是您要使用的名称。

您还需要更改表名,因为 Order 也是 SQL 中的保留关键字。

@Table(name = "TheOrder")
@Entity(name = "TheOrder")
public class Order

但是现在您必须在 JPQL 查询中使用 TheOrder 而不是 Order:

List<Tuple> list  = entityManager.createQuery(
            "select a " +
                    "from Table_A a " +
                    "join TheOrder o on a.orderID = o.orderID " +
                    "where o.status = :status ", Tuple.class)
            .setParameter("status", "Completed")
            .getResultList();

我认为这会导致更多混乱。所以最好更改班级名称。


1
投票

在不更改表名称的情况下,更好的选择是使用最流行的转义字符在查询中转义名称,例如根据您的情况,在表或列名称周围使用反引号 (``)、引号或双引号。

当我的一个表被命名为 Group 时,我遇到了类似的问题,甚至最初在制作 SQL 迁移文件时我也不得不转义该名称。 例如:

CREATE TABLE "group"

当我从存储库执行简单的内置

findAll
时,我得到了以下异常
InvalidDataAccessResourceUsageException: JDBC exception Caused by: org.postgresql.util.PSQLException: ERROR: syntax error at or near "group" 

所以,我意识到问题出在保留关键字

group
。 为了避免编辑、重命名、重构等,我决定尝试在实体类中以某种方式转义名称。

幸运的是,这可以通过在

@Table
注释中指定表名来实现:

@Entity
@Table(name = "\"group\"")
public class Group...

此后,它知道如何在后台执行查询时转义这个保留关键字。

我测试了反引号是否可以代替

\"
,它也能起到作用。

@Table(name = "`group`")

您还可以将此方法与

@Column
结合使用,以避免使用保留关键字命名的列出现此类问题,如本 answer 中所述。

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