Hibernate - переписать устаревшие createCriteria - PullRequest
2 голосов
/ 20 января 2020

У меня есть следующий код Hibernate:

        return (Post)sessionFactory.getCurrentSession()
                .createCriteria(Post.class)
                .add(Restrictions.eq("title", title))
                .add(Restrictions.eq("description", description))
                .uniqueResult();

Но метод createCriteria устарел. Как переписать его на CriteriaQuery, чтобы код оставался минималистичным c и без использования CriteriaBuilder.

1 Ответ

2 голосов
/ 20 января 2020

В документах 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, вам не придется менять свой код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...