java - 从 Hibernate 版本 5.3.0 返回 "ordinal parameter not bound 1"

标签 java hibernate jpa

正在将 Hibernate 从 5.1.2.Final 升级到 5.4.13。我在下面的代码中遇到问题,

@Entity
@NamedNativeQuery(name = "getStudentDetails", resultClass = StudentEntity.class, query = "{call getStudentDetails(?)}")
public class StudentEntity {
private Long id;
private String name;
}

我的 DAO 类如下所示,

public List<StudentEntity> getStudentDetails(){
 List<StudentEntity> result = null;
 try{
   Query query = em.createNamedQuery("getStudentDetails");
   result = query.getResultList();
}catch(Exception e){

}
return result;
}

创建或替换过程 getStudentDetails(p_return_cur OUT SYS_REFCURSOR) 是仅具有输出参数的存储过程。

我没有在java代码中设置outparameter。直到 Hibernate 5.2.* 没有这个问题。当更新到 5.3.* 时,它返回“序数参数未绑定(bind) 1”。

最佳答案

自 5.3 起不再支持位置参数

HQL/JPQL 查询中对旧式查询参数(“?”)声明的支持已被删除。该功能自 Hibernate 4.1 起已被弃用,并最终在 5.3 版本中删除。

因此,以下查询声明无效:

Query<Product> query = OBDal.getInstance().getSession()
    .createQuery("from Product as p where p.name = ? and p.stocked = ?", Product.class);
query.setParameter(0, "Ale Beer");
query.setParameter(1, true);

为了使前面的查询正常工作,它必须使用命名参数:

Query<Product> query = OBDal.getInstance().getSession()
    .createQuery("from Product as p where p.name = :name and p.stocked = :isStocked", Product.class);
query.setParameter("name", "Ale Beer");
query.setParameter("isStocked", true);

代码示例取自http://wiki.openbravo.com/wiki/Hibernate_5.3_Migration_Guide

关于java - 从 Hibernate 版本 5.3.0 返回 "ordinal parameter not bound 1",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62060453/

相关文章:

java - 从表单编码传递的土耳其语字符在浏览器上有所不同

java - 使用 XSSFWorkbook 创建 xlsx 文件,但在使用方法 createSheet ("String"时出错)

java - 警告 : Failed to load the sqljdbc_auth. dll 导致 : no sqljdbc_auth in java. library.path

java - 如何使用 JPA 延迟加载实体属性

java - Spring JPA Hsqldb 持久化

spring - 如何在查询数据库时为 JPA 实体中的列生成值?

java - AppEngine BlobStore 无法上传 blob,因为从 1.5.5 更新到 1.6.1 | getUploads(req) 和 getUploadedBlobs(req) 都失败

java - 如何使用 hibernate 条件调用 postgres 函数

java - 从 Hibernate hbm 到 JPA 注释,一个具有挑战性的任务

java - 在 Spring 中将 JPA EntityManager 和 Hibernate session 与共享事务管理器一起使用