hibernate
Criterios y Proyecciones
Buscar..
Lista usando restricciones
Suponiendo que tenemos una tabla TravelReview con nombres de ciudades como columna "título"
Criteria criteria =
session.createCriteria(TravelReview.class);
List review =
criteria.add(Restrictions.eq("title", "Mumbai")).list();
System.out.println("Using equals: " + review);
Podemos agregar restricciones a los criterios encadenándolos de la siguiente manera:
List reviews = session.createCriteria(TravelReview.class)
.add(Restrictions.eq("author", "John Jones"))
.add(Restrictions.between("date",fromDate,toDate))
.add(Restrictions.ne("title","New York")).list();
Utilizando proyecciones
Si deseamos recuperar solo unas pocas columnas, podemos usar la clase Proyecciones para hacerlo. Por ejemplo, el siguiente código recupera la columna de título
// Selecting all title columns
List review = session.createCriteria(TravelReview.class)
.setProjection(Projections.property("title"))
.list();
// Getting row count
review = session.createCriteria(TravelReview.class)
.setProjection(Projections.rowCount())
.list();
// Fetching number of titles
review = session.createCriteria(TravelReview.class)
.setProjection(Projections.count("title"))
.list();
Utilizar filtros
@Filter
se usa como un campamento WHERE
, aquí algunos ejemplos
Entidad estudiantil
@Entity
@Table(name = "Student")
public class Student
{
/*...*/
@OneToMany
@Filter(name = "active", condition = "EXISTS(SELECT * FROM Study s WHERE state = true and s.id = study_id)")
Set<StudentStudy> studies;
/* getters and setters methods */
}
Entidad de estudio
@Entity
@Table(name = "Study")
@FilterDef(name = "active")
@Filter(name = "active", condition="state = true")
public class Study
{
/*...*/
@OneToMany
Set<StudentStudy> students;
@Field
boolean state;
/* getters and setters methods */
}
Estudiante entidad de estudio
@Entity
@Table(name = "StudentStudy")
@Filter(name = "active", condition = "EXISTS(SELECT * FROM Study s WHERE state = true and s.id = study_id)")
public class StudentStudy
{
/*...*/
@ManytoOne
Student student;
@ManytoOne
Study study;
/* getters and setters methods */
}
De esta manera, cada vez que se activa el filtro "activo",
-Todas las consultas que hacemos sobre la entidad estudiantil devolverán TODOS los estudiantes SOLAMENTE con su state = true
estudios state = true
-Cada consulta que hagamos en la entidad de Estudio devolverá TODOS state = true
estudios de state = true
-Todas las consultas que hacemos en la entidad StudentStudy devolverán SOLAMENTE las que tengan una relación de estudio state = true
Tenga en cuenta que study_id es el nombre del campo en la tabla de StudentStudy de sql