2010-07-10 17 views
4

J'ai une entité Hibernate, appelée Event, qui a une entité de métadonnées un-à-plusieurs, EventData.Hibernate recherche un-à-plusieurs avec les critères

Compte tenu de l'événement suivant:

EventId: 1
EventHash: brocoli

Avec les EventDatas suivants:

EventDataId: 1
EventId: 1
terrain: tag
contenu : tagme

EventD ataId: 2
EventId: 1
terrain: tag
Contenu: anotherTag

Comment puis-je créer une requête de critères pour récupérer l'événement qui a des balises "anotherTag" et "Tagme"? Dans SQL, je rejoins la table event_data une fois pour chaque étiquette étant recherchée, mais je ne peux pas sembler créer un alias pour la relation Event.EventData, à savoir

int inc = 0; 

Conjunction junc = Restrictions.conjunction(); 

for (String tag : tags) { 
    crit.createAlias("e.EventData", "ed"+inc); 
    junc.add(
     Restrictions.and(
      Restrictions.eq("ed"+inc+".field", "tag"), 
      Restrictions.eq("ed"+inc+".content", tag) 
     ) 
    ); 
    inc++; 
} 

Ne fonctionne pas; duplicate association path: Event.EventData

De même, une Conjonction normale ne fonctionne pas, parce que la clause finit comme:

((ed3_.field='tag' and ed3_.content='anotherTag') and (ed3_.field='tag' and ed3_.content='tagme')) 

et, malheureusement, le champ de base de données ne peut pas avoir deux valeurs différentes en même temps.

Des idées sur comment je pourrais nettoyer cela, ou est la seule option revenant à HQL?

Répondre

4
List fields = new ArrayList(1); 
fields.add("tag") 

List contents = new ArrayList(tags.size()); 
for (String tag : tags) { 
    contents.add(tag); 
} 

session.createCriteria(Event.class); 
criteria.createCriteria("eventDatas").add(Restrictions.and(Restrictions.in("field", fields), Restrictions.in("content", contents))); 

/* si la taille des champs est toujours un, vous pouvez utiliser Restrictions.eq ("champs", "tag") aussi */

+0

Superbe, merci! – Martin