Hibernate实体只有一列,没有名字

Hibernate entity only one column, no name

我想映射一列,而不使用列名。

我正在使用一个计数实体,并且想对同一实体使用多个不同的查询:

@Entity
public class CountDTO extends Number {

    @Id
    // below causes an error in my test, hsql not same syntax
    @Column(name = 'COUNT') 
    private Long count;

在我的 prod (oracle) 数据库中,我可以 select count() as COUNT from ...但是,使用 hypersql 内存数据库时,相同的语法不起作用?

它们是一种 oracle/hsql 兼容的方式来映射 HQL 中的单个列别名吗?

您的问题是 COUNTreserved keyword for HSQL, but not for Oracle

根据 HSQL 文档,仍然可以使用 COUNT 作为标识符,如果您

  • 按照Hibernate documentation or in the JPA spec (cf. chapter 2.13 from the JPA 2 spec中的描述屏蔽它;您需要接受他们的许可协议)。请注意,JPA 规范提到了 双引号 而 Hibernate 文档提到了 backticks (将根据数据库方言将其转换为适当的字符使用).

    来自休眠文档:

    You can force Hibernate to quote an identifier in the generated SQL by enclosing the table or column name in backticks in the mapping document. Hibernate will use the correct quotation style for the SQL Dialect. This is usually double quotes, but the SQL Server uses brackets and MySQL uses backticks.

    来自 JPA 2 规范:

    Using annotations, a name is specified as a delimited identifier by enclosing the name within double quotes, whereby the inner quotes are escaped, e.g., @Table(name="\"customer\"").

  • 通过执行 SET DATABASE SQL NAMES FALSE 配置 HSQL 以允许它(但是,这应该已经是默认设置并且它只允许 "the use of most keywords",而不是全部 - 编辑:[=根据文档,10=] 仍将被禁止)

我的建议是尽可能避免使用标识符,因为您永远不知道其他地方可能会出现什么问题(例如,有人可能认为 Hibernate 可以自己屏蔽关键字)并使用 COUNT1 之类的东西代替列名字.

JPA 规范的上述部分还解释了为什么 Hibernate 不屏蔽名称本身:

By default, the names of database objects must be treated as undelimited identifiers and passed to the database as such.

JPA 规范还提到了一个 <delimited-identifiers/> 选项“以指定所有用于持久性单元的数据库标识符都被视为 定界标识符”,但这似乎只能用于 XML 映射文件。