Hibernate位置参数为零

时间:2016-06-22 16:42:32

标签: java sql hibernate jpa parameters

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

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

根据JPA 2.1 Specification

  

3.10.13位置参数

     

只有位置参数绑定和对结果项的位置访问才能可移植地用于本机   查询,但已定义命名参数的存储过程查询除外。 :当   绑定位置参数的值,编号从“1”开始。假设为本机   查询参数本身使用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();

这适用于hibernate 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版本中找不到类似的代码。

我在2009年的休眠forums中发现了一篇帖子:

  

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

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

有没有办法配置Hibernate 5.2来取回基于1的位置参数?我不想改变代码,以免不符合规范。

1 个答案:

答案 0 :(得分:3)

Hibernate 5.2已将hibernate-entitymanager模块合并到hibernate-core,因此在此过程中可能会出现此问题。

你需要打开一个JIRA问题,我们会照顾它。

Hibernate 5.2.1 解决了这个问题。