Являются ли позиционные параметры устаревшими в Hibernate 5.3.2? - PullRequest
0 голосов
/ 29 октября 2018

Мы мигрируем с Hibernate 3 на Hibernate 5.3. Мы использовали позиционные параметры в HQL, я вижу некоторые сообщения о поддержке Hibernate, в которых говорится, что позиционные параметры больше не поддерживаются в Hibernate 5. И их следует заменить именованными параметрами?

Может ли кто-нибудь это подтвердить?

И если возможно, пожалуйста, дайте мне знать, что все устарели от Hibernate 3?

Заранее спасибо.

1 Ответ

0 голосов
/ 29 октября 2018

Удалена поддержка объявлений параметров запроса в стиле ('?') В запросах 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

...