hibernate
Critères et Projections
Recherche…
Liste utilisant des restrictions
En supposant que nous ayons une table TravelReview avec des noms de villes comme colonne "title"
Criteria criteria =
session.createCriteria(TravelReview.class);
List review =
criteria.add(Restrictions.eq("title", "Mumbai")).list();
System.out.println("Using equals: " + review);
Nous pouvons ajouter des restrictions aux critères en les enchaînant comme suit:
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();
Utiliser des projections
Si nous souhaitons ne récupérer que quelques colonnes, nous pouvons utiliser la classe Projections pour le faire. Par exemple, le code suivant récupère la colonne de titre
// 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();
Utiliser des filtres
@Filter
est utilisé comme un camp WHERE
, voici quelques exemples
Entité étudiante
@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 */
}
Entité d'étude
@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 */
}
StudentStudy Entity
@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 cette façon, chaque fois que le filtre "actif" est activé,
-Toutes les requêtes que nous faisons sur l'entité étudiante renverront TOUS les étudiants avec SEULEMENT leur state = true
études state = true
-Toutes les requêtes que nous faisons sur l'entité Study retourneront ALL state = true
-Toute requête que nous faisons sur StudentStudy retournera UNIQUEMENT ceux avec un state = true
Relation d'étude
Notez que study_id est le nom du champ sur la table sql StudentStudy