gpt4 book ai didi

grails - 多对多Grails-查找包含特定对象列表的所有对象

转载 作者:行者123 更新时间:2023-12-02 14:49:40 26 4
gpt4 key购买 nike

我有以下域模型:

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

最佳答案

在这里,您需要检查属于ingredients的一组Recipe是否包含要传递的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子句使查询可以过滤掉那些重复的 list 。
  • 但是,这些重复项是此hack的关键:如果配料列表是唯一列表,并且食谱中的相同配料不只一次,则如果重复项的数量等于,则食谱具有所有必需的配料成分数。这就是HAVING子句通过计算配方数来执行的操作。
  • 关于grails - 多对多Grails-查找包含特定对象列表的所有对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38555416/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com