В документах Hibernate 5.4 рекомендуется использовать классы Jakarta Persistence API (JPA) в пакете javax.persistence.criteria
везде, где мы использовали метод SharedSessionContract.createCriteria(java.lang.Class)
Hibernate. Фактически все методы, включая перегрузки метода createCriteria
, который возвратил org.hibernate.Criteria
, устарели, что косвенно означает, что Hibernate больше не хочет, чтобы мы использовали их интерфейс org.hibernate.Criteria
. В версии 5.4 отсутствует класс реализации или расширяющий интерфейс для интерфейса Criteria
. Короче говоря, hibernate Session
, который раньше действовал как фабрика для Criteria
объектов, больше не производит их, и Criteria
может полностью устареть в будущих версиях.
Во-вторых, Hibernate предложил полезный API в пакете org.hibernate.criterion
, например, Restrictions, Example, et c. Проблема состоит в том, что все эти классы имеют только один потребительский класс типа org.hibernate.Criteria
, который считается устаревшим. Другими словами, если вы не можете использовать org.hibernate.Criteria
, вы также не можете использовать org.hibernate.criteria.Restrictions
.
Таким образом, если вам необходимо выполнить рефакторинг вышеприведенного кода сейчас, ваш единственный выбор - это то, что у вас под javax.persistence.criteria
. Поэтому ваш единственный выбор - использовать CriteriaBuilder
и CreateQuery
, как показано ниже.
CriteriaBuilder cb = sessionFactory.getCurrentSession().getCriteriaBuilder();
// Create query
CriteriaQuery<Post> q = cb.createQuery(Post.class)
Root<Post> r = q.from(Post.class);
Predicate[] predicates = new Predicate[2];
predicates[0] = cb.equal(root.get("title"), title);
predicates[1] = cb.equal(root.get("description"), description);
q.select(r).where(predicates);
Query<Post> query = session.createQuery(q);
return query.getSingleResult();
Да, этот код довольно многословен по сравнению с исходным кодом, использующим Hibernate API. Однако одно из преимуществ этого кода состоит в том, что он теперь отделен от Hibernate Speci c API. Поэтому в будущем, если вы захотите перейти на другую реализацию JPA, вам не придется менять свой код.