5

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

有人可以证实这一点吗?

如果可能的话,请让我知道 Hibernate 3 弃用了哪些内容?

提前致谢。

4

1 回答 1

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);

如果使用 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

于 2018-10-29T11:16:32.673 回答