Удалена поддержка объявлений параметров запроса в стиле ('?') В запросах 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);
Обратите внимание, что предыдущий запрос не завершится неудачей из-за внутреннего механизма, который преобразует позиционные параметры в именованные параметры. В любом случае рекомендуется использовать именованные параметры вместо этого, и по этой причине метод OBQuery.setParameters () не рекомендуется с версии 3.0PR18Q3.
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