Hibernate的位置参数基于零
我将一个项目从Hibernate 4.2.6迁移到5.2.0。
我注意到,对于Hibernate 5.2.0,本机查询现在需要基于零的参数定位。
根据JPA 2.1规范
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年的hibernate论坛中发现了一篇文章:
那么,只有当您使用JPA-Query-Api时,第一个参数的索引= 1。您正在使用Hibernate-Query-Api,其中第一个参数的索引必须为0。
Obvioulsy我正在使用JPA。 所以问题是:
有没有办法配置Hibernate 5.2来取回基于1的位置参数? 我不愿意改变代码,以便不符合规范。
Hibernate 5.2已经将hibernate-entitymanager
模块合并到了hibernate-core
,所以在这个过程中可能会出现这个问题。
你需要打开一个JIRA问题,我们会照顾它。
Hibernate 5.2.1修复了这个问题。
链接地址: http://www.djcxy.com/p/63825.html上一篇: Hibernate positional parameters zero based
下一篇: Can I make Hibernate label the SQL it produces with query names?