如何在hibernate@Formula中使用保留表列

如何在hibernate@Formula中使用保留表列,hibernate,hql,Hibernate,Hql,我尝试使用hibernate中的保留关键字列名。 即使加上引号,我还是会出错 我需要使用@Formula创建一个子查询 表如下图所示,请注意名为“row”的列,我们正在从外部系统查询,无法更改。这就是问题的根源 CREATE TABLE MyTestTable ( id int, `row` int NOT NULL, column1 int NOT NULL DEFAULT 0, column2 int NOT NULL DEFAULT 0, PRIMA

我尝试使用hibernate中的保留关键字列名。 即使加上引号,我还是会出错

我需要使用@Formula创建一个子查询

表如下图所示,请注意名为“row”的列,我们正在从外部系统查询,无法更改。这就是问题的根源

CREATE TABLE MyTestTable (
    id int,
    `row` int NOT NULL,
    column1 int NOT NULL DEFAULT 0,
    column2 int NOT NULL DEFAULT 0,
    PRIMARY KEY(id, `row`)
);
实体类如下所示:

@Entity
public class MyTestTable implements Serializable {
    @Id
    private int id;

    @Id
    @Column(name = "[row]")
    private int row;

    @Formula("select o.column1 + o.column2" +
            " from MyTestTable o where o.row = `row` AND o.id = id")
    private int calculatedSum;

    ... getters and setters
}
(calculatedSum在现实世界中使用20多列)

尝试获取calculatedSum的值时,我得到错误:

SQL语句“从MyTestTable o中选择选择o.column1+o.column2,其中o.row[*]=MyTestTable0..”“row”和o.id=MyTestTable0..id作为MyTestTable MyTestTable0.”中的col_0_0_uuuu0.“row”=1限制;预期的“标识符”

这里的问题是,因为row是一个保留关键字,所以查询最终会给出一个语法错误(在o.row中)。 在这一点上,您可能会认为在其周围添加引号是解决方案

@Formula("select o.column1 + o.column2" +
            " from MyTestTable o where `o.row` = `row` AND o.id = id")
    private int calculatedSum;
但这也带来了另一个错误:

16:18:30.547[main]ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper-未找到列“MyTestTable0\uuu0.o.row”;SQL语句: 从MyTestTable o中选择o.column1+o.column2,其中mytesttabl0_u0.id=1,mytesttabl0_0.row=1,mytesttabl0_0.id=1,mytesttabl0_0.id=1?[42122-199]

现在,o.row前面加了一个别名,即MyTestTable0\uU0.o.row 应该是o排

在这种情况下,如何编写对MyTestTable.row的工作引用?

根据公认的答案,出现在
@Formula
中的内容必须是有效的SQL片段,并且不可能引用类中的任何字段;您只能引用SQL列和表。假设您只想让Hibernate用
列1
列2
的总和填充
calculatedSum
字段,那么您应该使用:

@Formula(" column1 + column2 ")
private int calculatedSum;
根据公认的答案,
@Formula
中出现的内容必须是有效的SQL片段,并且不可能引用类中的任何字段;您只能引用SQL列和表。假设您只想让Hibernate用
列1
列2
的总和填充
calculatedSum
字段,那么您应该使用:

@Formula(" column1 + column2 ")
private int calculatedSum;

您的底层SQL数据库是什么(例如MySQL、SQL Server、Oracle、Postgres等)?单元测试在H2上,生产测试在MySQL上。如果我们能通过单元测试,我会把它作为答案。顺便说一句,使用两个不同的数据库进行测试和开发通常是个坏主意。所以,您可能想在任何地方都使用MySQL。我怀疑在某些情况下,您并没有真正进行单元测试,而是进行集成测试,在集成测试中,您实际上碰到了在内存中运行的H2数据库。理想情况下,这将是一种方法,但我还没有找到一种将MySQL作为内存中数据库运行以进行测试的方法。的确,我们应该称这些集成测试,而不是单元测试。我认为这些术语可能有点混淆。您的底层SQL数据库是什么(例如MySQL、SQL Server、Oracle、Postgres等)?单元测试在H2上,生产测试在MySQL上。如果我们能通过单元测试,我会把它作为答案。顺便说一句,使用两个不同的数据库进行测试和开发通常是个坏主意。所以,您可能想在任何地方都使用MySQL。我怀疑在某些情况下,您并没有真正进行单元测试,而是进行集成测试,在集成测试中,您实际上碰到了在内存中运行的H2数据库。理想情况下,这将是一种方法,但我还没有找到一种将MySQL作为内存中数据库运行以进行测试的方法。的确,我们应该称这些集成测试,而不是单元测试。我想这些术语可能有点混淆了。干得好,先生!似乎我把事情复杂化了,匹配主键是不必要的。是的……所以,你使用的逻辑似乎只是确保总和使用当前实体的值,但是
@Formula
已经为你处理了。是的,我认为只有当它们已经通过字段映射到实体类中时,才能这样引用它们。做得好,先生!似乎我把事情复杂化了,匹配主键是不必要的。是的……所以,你使用的逻辑似乎只是确保总和使用当前实体的值,但是
@Formula
已经为你处理了。是的,我认为只有当它们已经通过字段映射到实体类中时,才能这样引用它们。