java - Alternativa correcta a SharedSessionContract.createCriteria(Clase persistentClass) en Hibernate 5.2
spring hibernate-5.x (3)
En hibernate 5.2, org.hibernate.Session
implementa javax.persistence.EntityManager
, por lo que puede crear una consulta de criterios usando Session
directamente. Ver JPA - API de criterios .
Pero puede haber un error en la hibernación 5.2.1.Final, setCacheable
no funciona si, en su lugar, llame a JPA Criteria API TypedQuery#getResultList
, llame a Query#list()
.
public <T> T getAll(Class<T> clazz, boolean cache){
CriteriaQuery<T> query = getCurrentSession().getCriteriaBuilder().createQuery(clazz);
query.select(query.from(clazz));
Query<T> q = getCurrentSession().createQuery(query); // CriteriaQueryTypeQueryAdapter instance
q.setCacheable(cache); // execute AbstractProducedQuery#setCacheable
// return q.getResultList(); // CriteriaQueryTypeQueryAdapter#getResultList(), cache not works
return q.list(); // AbstractProducedQuery#list() cache may be enabled
}
Estoy actualizando a la última versión final de Hibernate 5.2.0 de Hibernate 3.x. En mi código anterior estábamos usando consultas de criterios como se muestra a continuación.
Session session =getHibernateTemplate().getSessionFactory().getCurrentSession();
Criteria criteria = session.createCriteria(Employee.class);
criteria.add(Restrictions.eq("Department", department));
return criteria.list();
Ahora, desde Hibernate 5.2.0, el método createCriteria () ha quedado en desuso. Que se puede encontrar en la siguiente documentación.
https://docs.jboss.org/hibernate/orm/5.2/javadocs/deprecated-list.html https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/SharedSessionContract.html#createCriteria-java.lang.Class-
La documentación sugiere utilizar criterios JPA. A continuación se presentan las pocas preguntas que he basado en el fondo anterior.
Dado que no estamos utilizando el EntityManager y dependemos en gran medida de HibernateDAOSupport y HibernateTemplate, ¿cómo puedo usar los criterios JAP utilizando la sesión o sessionFactory?
Si utilizo DetachedCriteria como se muestra en el siguiente fragmento de código, ¿será el mismo que el de la implementación anterior o el código siguiente nos dará resultados independientes de la sesión?
DetachedCriteria criteria = DetachedCriteria.forClass(Employee.class); criteria.add(Restrictions.eq("Department", department)); return (List<Employee>) getHibernateTemplate().findByCriteria(criteria);
También como alternativa, si uso la DetachedCriteria en la forma mencionada a continuación, tendrá el mismo impacto que en mi código anterior.
Session session =getHibernateTemplate().getSessionFactory().getCurrentSession(); DetachedCriteria criteria = DetachedCriteria.forClass(Employee.class); criteria.add(Restrictions.eq("Department", department)); return criteria .getExecutableCriteria(session).list();
Si hay una mejor manera de lidiar con esto, sugiérame, ya que no quiero cambiar el uso de HibernateDAOSupport y HibernateTemplate.
Siguiendo el enlace doc es estados:
"API de org.hibernate.Criteria heredada de Hibernate, que debe considerarse obsoleta"
Así que solo cambiando a DetachedCriteria se librará de la depreciación actual, pero se sugiere utilizar los criterios de JPA (que no son compatibles con org.hibernate.criterion.Restrictions, etc.). No está claro y la hoja de ruta no es de mucha ayuda.
Menciona:
"Eventualmente, las características de los criterios específicos de Hibernate se transferirán como extensiones a la JPA javax.persistence.criteria.CriteriaQuery"
¿Conseguiste algo más con esto?
Utilice CriteriaBuilder como se describe a continuación:
//Use below imports:
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
//creating session. This you can create in your own way.
Configuration cfg = new Configuration();
cfg.configure("hibernate.cfg.xml");
cfg.addAnnotatedClass(Employee.class);
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
//**creating CriteriaBuilder**
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Employee> criteria = builder.createQuery(Employee.class);
Root<Employee> employeeRoot=criteria.from(Employee.class);
criteria.select(employeeRoot);
//**Adding where clause**
criteria.where(builder.equal(employeeRoot.get("employeeId"), "E01"));
List<Employee> employeeList=session.createQuery(criteria).getResultList();