Hibernate 5.3.2中是否不推荐使用位置参数?

Hibernate 5.3.2中是否不推荐使用位置参数?,hibernate,java-8,hibernate-mapping,jpa-2.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<Produc

我们正在从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 Query=OBDal.getInstance().getSession()
.createQuery(“从作为p的产品,其中p.name=?和p.stocked=?”,Product.class);
query.setParameter(0,“啤酒”);
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<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);
Query Query=OBDal.getInstance().getSession()
.createQuery(“以p形式从产品开始,其中p.name=:name和p.stocked=:isStocked”,Product.class);
query.setParameter(“名称”、“啤酒”);
setParameter(“isStocked”,true);
如果使用OBQuery,建议既不要使用位置参数:

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<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);
OBQuery OBQuery=OBDal.getInstance().createQuery(Product.class,
“作为p,其中p.name=?和p.stocked=?”;
列表参数=新的ArrayList(2);
参数。添加(“淡啤酒”);
参数。添加(true);
obQuery.setParameters(参数);
请注意,前面的查询不会由于将位置参数转换为命名参数的内部机制而失败。在任何情况下,建议改用命名参数,因此自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 OBQuery=OBDal.getInstance().createQuery(Product.class,
“作为p,其中p.name=:name和p.stocked=:isStocked”);
映射参数=新的HashMap(2);
参数。输入(“名称”、“啤酒”);
参数put(“isStocked”,true);
obQuery.setNamedParameters(参数);
或者:

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);
OBQuery OBQuery=OBDal.getInstance().createQuery(Product.class,
“作为p,其中p.name=:name和p.stocked=:isStocked”);
obQuery.setNamedParameter(“名称”、“啤酒”);
setNamedParameter(“isStocked”,true);
有关迁移到Hibernate 5.3的更多帮助: