正在将 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/