java - criteriabuilder - Método obsoleto createCriteria en Hibernate 5
hibernate 5 select where (4)
Esta llamada está en desuso:
session.createCriteria(Bus.class).list();
En los archivos de origen puedo ver esto:
/** @deprecated */
@Deprecated
Criteria createCriteria(Class var1);
/** @deprecated */
@Deprecated
Criteria createCriteria(Class var1, String var2);
/** @deprecated */
@Deprecated
Criteria createCriteria(String var1);
/** @deprecated */
@Deprecated
Criteria createCriteria(String var1, String var2);
Pero no puedo entender qué método tengo que usar en lugar de
createCriteria
.
Agregar respuesta a partir de marzo de 2018.
Dependencias:
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.service.ServiceRegistry;
import javax.persistence.criteria.CriteriaQuery;
import java.util.List;
public static List<Contact> fecthAllContacts() {
Session session = sessionFactory.openSession();
// create Criteria
CriteriaQuery<Contact> criteriaQuery = session.getCriteriaBuilder().createQuery(Contact.class);
criteriaQuery.from(Contact.class);
List<Contact> contacts = session.createQuery(criteriaQuery).getResultList();
session.close();
return contacts;
}
mientras que
sessionFactory
es:
public static SessionFactory buildSessionFactory() {
final ServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();
return new MetadataSources(registry).buildMetadata().buildSessionFactory();
}
En su lugar, puede utilizar las siguientes interfaces en Hibernate 5.2 +:
javax.persistence.criteria.CriteriaBuilder
javax.persistence.criteria.CriteriaQuery
// Create CriteriaBuilder
CriteriaBuilder builder = session.getCriteriaBuilder();
// Create CriteriaQuery
CriteriaQuery<YourClass> criteria = builder.createQuery(YourClass.class);
Tenía el siguiente método, cambié los nombres de los objetos por razones de seguridad:
public List<MyObject> listAllForIds(List<Long> ids) {
Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(MyObject.class)
.createAlias("joinObject", "joinObject")
.add(Restrictions.not(Restrictions.like("name", "string1", MatchMode.END)))
.add(Restrictions.not(Restrictions.like("name", "string2", MatchMode.END)))
.add(Restrictions.in("joinObject.id", ids));
return criteria.list();
}
Cambiando eso para usar:
javax.persistence.criteria.CriteriaBuilder
javax.persistence.criteria.CriteriaQuery
La consulta tiene el siguiente aspecto:
public List<MyObject> listAllForIds(List<Long> ids) {
CriteriaBuilder builder = getSessionFactory().getCurrentSession().getCriteriaBuilder();
CriteriaQuery<MyObject> criteria = builder.createQuery(MyObject.class);
Root<MyObject> myObjectRoot = criteria.from(MyObject.class);
Join<MyObject, JoinObject> joinObject = myObjectRoot.join("joinObject");
Predicate likeRestriction = builder.and(
builder.notLike( myObjectRoot.get("name"), "%string1"),
builder.notLike( myObjectRoot.get("name"), "%string2")
);
criteria.select(myObjectRoot).where(joinObject.get("id").in(ids), likeRestriction);
TypedQuery<MyObject> query = getSessionFactory().getCurrentSession().createQuery(criteria);
return query.getResultList();
}
Espero que ayude a alguien más, no dude en sugerir cualquier cambio para mejorar el código.
de la documentación de la API:
@ Criterios reducidos createCriteria (Class persistentClass) En desuso. (desde 5.2) para la sesión, use la instancia Crear criterios de JPA para la clase dada (entidad o subclases / implementadores). Parámetros: persistentClass - La clase, que es una entidad, o tiene subclases / implementadores de entidad Devuelve: La instancia de criterios para manipulación y ejecución
Entonces dice brevemente a ...
utilizar los criterios JPA Crear criterios