多对多查询使用XX成分查找所有“食谱”

时间:2014-05-22 12:41:50

标签: java sql playframework many-to-many

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

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

RECIPE表:

ID             BIGINT     19                                                  
DESCRIPTION    CLOB       2147483647                                               
NAME           VARCHAR    255                                                     

INGREDIENT表:

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;

我想要的查询是...我有一个逗号分隔成分的字符串,例如milk,flour,egg。有了这个字符串,我想要获取所有具有这些成分的食谱,让我们说一个食谱只有flour作为成分然后才是真的。还有所有提到的食谱等等。

我修改了昨天发现的查询字符串(不记得在哪里),但我无法让它工作。

我收到此错误:

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 个答案:

答案 0 :(得分:1)

我认为你不能通过一个简单的查询来做到这一点。

为什么: - 你需要知道所有成分是否在你的成分串中。 使用having无法解决问题,不同的食谱会有不同的成分。

我不太熟悉JPA的工作原理,但在纯sql(例如mysql)中,您可以使用view来组织数据,然后再使用新查询处理数据。

我很抱歉,我无法帮助您解决JPA中的查询问题。

答案 1 :(得分:0)

看起来你需要引号:

...在(&#39;牛奶&#39;,&#39;面粉&#39;,#39;鸡蛋&#39;)组中的Ingredient.name被....