gpt4 book ai didi

java - Hibernate 位置参数从零开始

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:24:31 24 4
gpt4 key购买 nike

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

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

根据JPA 2.1 Specification

3.10.13 Positional Parameters

Only positional parameter binding and positional access to result items may be portably used for native queries, except for stored procedure queries for which named parameters have been defined. When binding the values of positional parameters, the numbering starts as “1”. It is assumed that for native queries the parameters themselves use the SQL syntax (i.e., “?”, rather than “?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 版本中找不到类似的代码。

我在hibernate中找到了一个帖子forums追溯到 2009 年:

Well, only if you use the JPA-Query-Api the first parameter must have index = 1. You are using the Hibernate-Query-Api where the first parameter must have index = 0.

很明显,我正在使用 JPA。所以问题是:

有没有办法配置 Hibernate 5.2 来取回基于 1 的位置参数?我不想为了不符合规范而更改代码。

最佳答案

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

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

关于java - Hibernate 位置参数从零开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37973915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com