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

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

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

有人可以证实这一点吗?

如果可能的话,请让我知道 Hibernate 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

关于hibernate - Hibernate 5.3.2 中是否弃用了位置参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53043871/

相关文章:

java - Oracle 表被 Hibernate 丢弃;从回收站闪回到DB。出现错误 "SQL Error: 942, SQLState: 42000"

java - 如何在 hibernate 中将ManyToOne关系设置为null

java - 是否可以在 Stream.parallel() 中设置线程的优先级?

sql - 在 Spring Boot 中创建原生 SQL 查询而不创建实体类

java - JPA/Hibernate : What's better for composite primary keys, @IdClass 或 @EmbeddedId 实现,为什么?

java - JPA hibernate 持久化pb

java - 为什么 parallelStream 不使用整个可用的并行性?

java - 以 Java 8 日期为逻辑类型的 Avro

java - 将 Hibernate 配置放在不同的位置

java - 如何删除孤立记录?