【问题标题】:Hibernate positional parameters zero based休眠位置参数从零开始
【发布时间】:2016-10-24 17:49:34
【问题描述】:

我正在将一个项目从 Hibernate 4.2.6 迁移到 5.2.0。

我注意到对于 Hibernate 5.2.0,本机查询现在需要基于零的参数定位。

根据JPA 2.1 Specification

3.10.13 位置参数

只有位置参数绑定和对结果项的位置访问可以可移植地用于原生 查询,但已定义命名参数的存储过程查询除外。 什么时候 绑定位置参数的值,编号从“1”开始。假设对于native 查询参数本身使用 SQL 语法(即“?”,而不是“?1”)。

我对规范的理解是,即使是原生查询,编号也应该从 1 开始。

现在根据 Query.setParameter(int, Object) 的 Hibernate 文档。 该位置从 0 开始编号。在 Hibernate 4.2 和 5.2 的文档中。

我做了一个微测试

首先使用 Hibernate 4.2.6

@PersistenceContext 
private EntityManager entityManager;


Query query = entityManager.createNativeQuery("select * from Game g where title = ?");
query.setParameter(1, GAME_TITLES[0]);
List list = query.getResultList();

这适用于休眠 4.2.6。

persistence.xml 文件如下所示

<persistence-unit name="test" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>jdbc/arquillian</jta-data-source>
    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
        <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
    </properties>
</persistence-unit>

与 Hibernate 5.2 相同

Query query = entityManager.createNativeQuery("select * from Game g where title = ?");
query.setParameter(0, GAME_TITLES[0]);
List list = query.getResultList();

唯一的区别是 setParameter 中的 0 索引。

persistence.xml 也很相似

<persistence-unit name="test">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <jta-data-source>jdbc/arquillian</jta-data-source>
    <properties>
        <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform" />
        <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
    </properties>
</persistence-unit>

我在两个版本中都跟踪了代码。我可以在 4.2.6 中找到处理基于 1 的索引的位置。我在 5.2 版本中找不到类似的代码。

我在 hibernate forums 中发现了一个可以追溯到 2009 年的帖子:

好吧,只有当您使用 JPA-Query-Api 时,第一个参数必须具有 index = 1。 您正在使用 Hibernate-Query-Api,其中第一个参数必须具有 index = 0。

显然我正在使用 JPA。 所以问题是:

有没有办法配置 Hibernate 5.2 以取回基于 1 的位置参数?我不愿意更改代码以不符合规范。

【问题讨论】:

  • 您对JPA原生查询编号参数的理解是正确的。从 1 开始,就像 JDBC。如果您的提供商不这样做,请报告错误

标签: java sql hibernate jpa parameters


【解决方案1】:

Hibernate 5.2 已经将hibernate-entitymanager 模块合并到hibernate-core 中,所以这个问题可能出现在这个过程中。

由于 Hibernate 5.2.1 已修复此问题,您只需升级到 5.2.1 或更高版本即可。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
相关资源
最近更新 更多