2010-08-12 5 views
3

J'ai un modèle qui a plusieurs propriétés. Les propriétés peuvent être primitives (String) ou complexes (Object). L'utilisateur peut faire une requête sur chaque propriété primitive. Je voudrais savoir s'il existe un moyen facile de construire dynamiquement la requête. J'utilise Java et Hibernate.Requête dynamique sur plusieurs propriétés avec Hibernate

Le modèle

public class Model { 
    String prop1; 
    Point prop2; 
    List<Shape> prop3; 
} 

Point et sont Shape objet qui peut contenir des primitives ou des objets. Un exemple de requête serait toutes les instances où prop1 = "A" et les coordonnées sont x = 3 et y = 8 et l'une des formes est un cercle. Prop1 = "A" et prop2.x = 3 et prop2.y et prop3.get (i) .type = "Cercle"; nous devrions itérer sur toutes les instances de prop3.

Ma première idée était insoutenable et inefficace. Il consiste à faire des requêtes sur toutes les propriétés primitives, puis à fusionner les résultats.

  • Obtenez tous les cas où prop1 = "A"
  • Obtenez tous les cas où prop2.x = 3 et prop3 = y;
  • Obtient toutes les instances où l'un des Shape.type = "Cercle";
  • Obtenez l'intersection des 3 ensembles

Y at-il bibliothèque existante ou d'un algorithme qui peut résoudre ce problème d'une manière meilleure (plus intelligent)?

Merci

+0

Voulez-vous interroger sur le "type Java" d'une forme ou avez-vous un champ pour le type? –

+0

Mon exemple était très simple par rapport à mon vrai modèle, mais les critères de recherche sont ce que je cherchais. – Sydney

Répondre

2

Avez-vous regardé Criteria queries? C'est une fonctionnalité Hibernate pour construire des requêtes et des paramètres par programme.

Si votre intention est d'interroger les entités qui correspondent à toutes ces conditions:

prop1 = "A" et prop2.x = 3 et prop2.y et prop3.get (i) .type = « Cercle »

avec prise en charge association queries, alors vous pourriez faire quelque chose comme

Criteria criteria = session.createCriteria(Model.class); 
criteria.add(Restrictions.eq("prop1", "A")); 
criteria.createCriteria("prop2") 
    .add(Restrictions.eq("x", 3)); 
    .add(Restrictions.eq("y", 2)); 
criteria.createCriteria("prop3").add(Restrictions.in("type", "Circle")); 

List results = criteria.list(); 

la force réelle dans les requêtes des critères est la construction de la requête dans le code plutôt th an dans une chaîne HQL - vous permet d'ajouter/définir dynamiquement des propriétés, etc.

+0

bien sûr vous pourriez écrire la même requête que j'ai ici en HQL (avec INs, JOINs, etc). –

Questions connexes