2016-07-24 29 views
1

的具體列表中的所有對象:Grails的許多一對多 - 查找包含我有以下的領域模型對象

class Recipe { 
    String title 
    static hasMany = [ ingredients : Ingredient ] 
} 

class Ingredient { 
    String ingredient 
    static hasMany = [ recipes : Recipe ] 
    static belongsTo = Recipe 
} 

Grails的創建與配料ID和配方ID表RECIPE_INGREDIENTS。

如何通過傳遞配料列表來獲取配方列表?

def egg = new Ingredient(ingredient:"Egg") 
def milk = new Ingredient(ingredient:"Milk") 
def flour = new Ingredient(ingredient:"Flour") 
def apple = new Ingredient(ingredient:"Apple") 
def banana = new Ingredient(ingredient:"Banana") 
def mango = new Ingredient(ingredient:"Mango") 


def pizza = new Recipe(title:"Pizza") 
pizza.addToIngredients(egg) 
pizza.addToIngredients(milk) 
pizza.addToIngredients(flour) 
pizza.save() 

def salad = new Recipe(title:"Fruit Salad with milk") 
salad.addToIngredients(apple) 
salad.addToIngredients(banana) 
salad.addToIngredients(mango) 
salad.addToIngredients(milk) 
salad.save() 

例如:

[mango, milk] return me salad 
[milk] return me salad and pizza 
[milk, flour] return me pizza 
+0

出於好奇,你嘗試過'Recipe.findAllByIngredientsInList([牛奶,芒果])' – injecteer

+0

OT應該是 「比薩蛋和奶」;) – cfrick

回答

0

在這裏,你需要檢查屬於Recipe一套ingredients是否包含要傳遞的ingredients的一個子集。我想不出使用GORMCriteira來做到這一點的直接方式。有一個可能的黑客攻擊,這一點使用HQL:

public List<Recipe> fetchRecipe(List<String> ingredients){ 
    ingredients = ingredients.unique() 
    Recipe.executeQuery(''' 
     SELECT recipe FROM Recipe AS recipe 
     JOIN recipe.ingredients as ingredients 
     WHERE ingredients.ingredient in :ingredients 
     GROUP BY recipe 
     HAVING COUNT(recipe) = :count 
    ''', [ingredients: ingredients, count: ingredients.size().toLong()]) 
} 

所以,當你執行該法:

println fetchRecipe(['milk'])*.title 
println fetchRecipe(['milk', 'banana'])*.title 
println fetchRecipe(['milk', 'egg'])*.title 

這將輸出:

[Pizza, Fruit Salad with milk] 
[Fruit Salad with milk] 
[Pizza] 

它是如何工作

  • 查詢從選擇具有配料列表中的任何配料的所有配方開始。只要食譜至少有一種食材會被退回。

  • 這產生列出配方的副作用,它爲每個匹配成分。例如,如果配方有兩種配料,則配方返回兩次。 GROUP BY子句使查詢過濾出那些重複列表。

  • 但是,這些重複是這個黑客的關鍵:如果成分列表是一個獨特的列表,並且食譜不止有一次相同的成分,那麼配方有所有必需的成分,如果數量重複數量等於配料數量。這就是HAVING從句通過計算食譜的數量所做的事情。

+0

哦..完美的答案。非常感謝你。我來研究Grails並不知道如何解決它。謝謝。 –

相關問題