冬眠位置参数基于零



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

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

根据JPA 2.1规格

3.10.13位置参数

只有位置参数绑定和对结果项目的位置访问可用于本地 查询,除了定义了命名参数的存储过程查询。 绑定位置参数的值,编号开始于" 1"。,假定对本机 查询参数本身使用SQL语法(即"?",而不是"?1")。

我对规范的理解是,即使对于本机查询,编号也应以1。

开始

现在根据Query.setParameter的Hibernate文档(INT,对象)。该位置的编号为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版中找不到类似的代码。

我在Hibernate论坛中找到了一个帖子,可以追溯到2009年:

好吧,只有当您使用jpa-Query-api时,第一个参数必须具有索引= 1。 您正在使用第一个参数必须具有索引= 0的Hibernate-Query-api。

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

有没有办法配置Hibernate 5.2以恢复1个基于1个位置参数?我不想更改代码以不符合规格。

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

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

最新更新