提问者:小点点

多对多查询查找所有"食谱"与XX成分


我正在做一个学校项目,所以我真的不是一个高级程序员,需要一点帮助来完成我需要做的查询。

我的数据库结构如下所示。

RECIPE表:

ID             BIGINT     19                                                  
DESCRIPTION    CLOB       2147483647                                               
NAME           VARCHAR    255                                                     

成分表:

ID             BIGINT     19                                             
NAME           VARCHAR    255 

RECIPE_INGREDIENT表:

RECIPE_ID         BIGINT    19                                            
INGREDIENTS_ID    BIGINT    19 

这是我的模型课食谱

 @Entity
 public class Recipe extends Model {
    @ManyToMany(cascade=CascadeType.ALL)
    public List<Ingredient> ingredients;
    @Required
    @Unique
    public String name;
    @Lob
    @Required
    public String description;

这是我的模型课

@Entity
public class Ingredient extends Model {
    @Required
    @Unique
    public String name;

我想问的问题是。。。我有一个用逗号分隔的字符串,比如牛奶、面粉、鸡蛋。有了这个字符串,我想获取所有的食谱,它们都有精确的成分,假设一个食谱只有面粉作为成分,那么这是真的。还有一份食谱,上面有所有提到的等等。

我修改了昨天找到的一个查询字符串(不记得在哪里),但无法使其工作。

我得到这个错误:

IllegalArgumentException occured : org.hibernate.hql.ast.QuerySyntaxException: unexpected token: on near line 1, column 68 [select Recipe.name from models.Recipe inner join Recipe_Ingredient on Recipe.ID = Recipe_Ingredient.Recipe_ID inner join Ingredient on Recipe_Ingredient.Ingredient_ID = Ingredient.ID where Ingredient.name in ( 'milk') group by Recipe.name having count(*) = 2] 

任何帮助都将不胜感激!如果我在这篇文章中犯了任何错误,我也很抱歉。这是我第一次来这里:)

编辑:

当前查询如下所示:

Query query = JPA.em().createQuery("SELECT Recipe.name "
    + "FROM Recipe INNER JOIN "
    + "Recipe_Ingredient ON Recipe.ID = Recipe_Ingredient.Recipe_ID "
    + "INNER JOIN Ingredient "
    + "ON Recipe_Ingredient.Ingredient_ID = Ingredient.ID "
    + "WHERE Ingredient.name "
    + "IN ("+ingredientsCSV+") "
    + "GROUP BY Recipe.name HAVING count(*) = 2");

共2个答案

匿名用户

我认为用一个简单的查询无法做到这一点。

为什么:-你需要有办法知道所有的成分是否都在你的成分串内。使用具有不会解决的问题是不同的食谱将具有不同量的成分。

我不太熟悉JPA是如何工作的,但是在纯sql中,例如mysql,您可以在使用新查询处理数据之前使用view来组织数据。

很抱歉,在JPA中,我无法帮助您解决这个问题。

匿名用户

看起来您需要以下内容的报价:

... 成分名称在(‘牛奶’、‘面粉’、‘鸡蛋’)组中由。。。。