#java #hibernate #jpa
В новом Hibernate использование Criteria является Deprecated. Как я могу заменить такой код с использованием org.hibernate.Criteria: Criteria criteria = session.createCriteria(Role.class); long id = ((Role) criteria.add(Restrictions.eq("name", name)).uniqueResult()).getId(); на его эквивалент с использованием javax.persistence.criteria.CriteriaBuilder из JPA ?
Ответы
Ответ 1
em - экземпляр EntityManager. public Long query(String name) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuerycq = cb.createQuery(Role.class); Root root = cq.from(Role.class); cq.where(cb.equal(root.get("name"), cb.parameter(String.class, "name"))); // cq.distinct(true); Query q = em.createQuery(cq); q.setParameter("name", name); List result = q.getResultList(); if (result.size() > 0) { return result.get(0).getId(); } return null; } Ответ 2
Ну вот когда есть что скопипастить (спасибо, Виктор) public Long query(String name) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuerycq = cb.createQuery(Role.class); Root root = cq.from(Role.class); cq.where(cb.equal(root.get("name"), cb.parameter(String.class, "name"))); try { // Тут возможно надо делать приведение типов, // либо вызывать вариант метода, в котором указывается тип возвращаемого параметра // em.createQuery(cq, Role.class)... // либо и так сойдёт return em.createQuery(cq).setParameter("name", name).getSingleResult().getId(); } catch (NoResultException ex) { return null; } } или public Long query(String name) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Role.class); Root root = cq.from(Role.class); cq.where(cb.equal(root.get("name"), cb.parameter(String.class, "name"))); List roles = em.createQuery(cq).setParameter("name", name).getResultList(); return roles.isEmpty() ? null : roles.get(0).getId(); } Ну то есть вариант Виктора без лишнего distinct и местами собранный в одну строку за счёт fluent-а, широко применяемого в JPA API. Если используете генерацию статичной метамодели, тогда root.get("name") заменяется на root.get(Role_.name). Типа безопасно. Чо. Иначе на фига Вам вообще criteria, когда есть текстовый JPQL, а ещё лучше SQL?
Комментариев нет:
Отправить комментарий