我们正在从Hibernate 3迁移到Hibernate 5.3,我们在HQL中使用了位置参数,我在Hibernate支持上看到一些帖子说Hibernate 5中不再支持位置参数,应该用命名参数替换吗? >
有人可以确认吗?
如果可能的话,请让我知道Hibernate 3弃用了什么?
谢谢。
答案 0 :(得分:0)
已删除对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);
在使用OBQuery的情况下,建议不要使用位置参数:
OBQuery<Product> obQuery = OBDal.getInstance().createQuery(Product.class,
"as p where p.name = ? and p.stocked = ?");
List<Object> parameters = new ArrayList<>(2);
parameters.add("Ale Beer");
parameters.add(true);
obQuery.setParameters(parameters);
请注意,由于内部机制会将位置参数转换为命名参数,因此上一个查询不会失败。无论如何,建议改用命名参数,因此从3.0PR18Q3版本开始,不建议使用OBQuery.setParameters()方法。
OBQuery提供了setNamedParameters方法,以提供一个包含命名参数及其各自值的映射:
OBQuery<Product> obQuery = OBDal.getInstance().createQuery(Product.class,
"as p where p.name = :name and p.stocked = :isStocked");
Map<String, Object> parameters = new HashMap<>(2);
parameters.put("name", "Ale Beer");
parameters.put("isStocked", true);
obQuery.setNamedParameters(parameters);
或者:
OBQuery<Product> obQuery = OBDal.getInstance().createQuery(Product.class,
"as p where p.name = :name and p.stocked = :isStocked");
obQuery.setNamedParameter("name", "Ale Beer");
obQuery.setNamedParameter("isStocked", true);
有关迁移到Hibernate 5.3的更多帮助,请访问http://wiki.openbravo.com/wiki/Hibernate_5.3_Migration_Guide