Hibernate 5.3.2是否弃用了位置参数?

时间:2018-10-29 10:48:22

标签: hibernate java-8 hibernate-mapping jpa-2.2

我们正在从Hibernate 3迁移到Hibernate 5.3,我们在HQL中使用了位置参数,我在Hibernate支持上看到一些帖子说Hibernate 5中不再支持位置参数,应该用命名参数替换吗? >

有人可以确认吗?

如果可能的话,请让我知道Hibernate 3弃用了什么?

谢谢。

1 个答案:

答案 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