2017-08-18 1 views
0

J'ai un CarModel et CarModelColor domaine relation est CarModel hasMany CarModelColorHQL un à plusieurs requêtes

CarModel{ 
    String name 
    static hasMany = [carModelColors: CarModelColor] 
} 

CarModelColor{ 
    String color 
} 

Maintenant, si vous passez 2 couleurs dire red and black nous avons besoin de tous ces modèles qui hai à la fois la couleur atleast. S'il vous plaît noter que l'utilisateur peut passer n nombre de couleurs à cette fonction et le résultat nécessite au moins que n couleurs.

Répondre

0

Peut être faite en utilisant suivre dans la requête

HQL

select model from CarModel as model 
join model.carModelColors as modelColors 
where modelColors.color in ? 

Critères

CarModel.withCriteria { 
    carModelColors { 
     "in"("color", colorList) 
    } 
} 
+0

pas, si vous utilisez « dans » il donnera ceux qui ont un seul Couleur. J'ai besoin de ceux qui ont les deux couleurs – Ashu

+0

@Ashu voir si cela aide https://stackoverflow.com/questions/12784960/hibernate-select-entities-where-collection-contains-all-of-the-specified-valus –

0

plutôt une simple requête

CarModel{ 
    String name 
    static hasMany = [carModelColors: CarModelColor] 
} 

CarModelColor{ 
    String color 
} 

Query est

String query=""" 
select new map(cm.id as id, cm.name as name, cmc.color as color) from CarModel cm left join carModelColors cmc where cmc.color in (:colorList) 
"" 
Map wp=[:] 
wp.colorList=['red','black'] 
def results = CarModel.executeQuery(query,wp,[readOnly:true]) 

Mais maintenant, vous allez vous retrouver avec autant d'itérations de carModel que leurs couleurs que si les deux trouvé puis deux.

Vous pouvez ajouter un group by cm.id

L'astuce est au-dessus de la jointure gauche et évidemment in (:list)

Vous pouvez laisser tomber la sélection nouvelle carte et obtenir l'objet brut si vous préférez en faisant:

String query=""" 
    from CarModel cm where cmc.carModelColors.color in (:colorList) 
    "" 
    Map wp=[:] 
    wp.colorList=['red','black'] 
    def results = CarModel.executeQuery(query,wp,[readOnly:true]) 

Le moment où vous commencez à ajouter des jointures à gauche, qui signifie null ou tous les enregistrements plutôt qu'un ensemble définitif qui est une jointure et une jointure ne renvoie pas non plus hasMany où la jointure à gauche retourne tous les enregistrements.

Mais si vous avez ajouté une jointure gauche

String query=""" 
select new map(cm as carModel) from CarModel cm left join carModelColors cmc where cmc.color in (:colorList) 
"" 
Map wp=[:] 
wp.colorList=['red','black'] 
def results = CarModel.executeQuery(query,wp,[readOnly:true]) 

Vous pouvez alors obtenir l'objet réel de results.carModel

Il est tout parti des pistes, mais il vous montre toutes les façons de faire de même comme cela dépend de ce qui se passe avec cet objet de domaine, je le fais parfois depuis que dans l'objet de domaine sont beaucoup de goodies de marche vers l'avant à partir de la requête.

Rappelez-vous une carte est plat et contient généralement une carte plane d'éléments et est léger par rapport aux objets passés autour (dans le monde sql)