我正在做一个学校项目,所以我真的不是一个高级程序员,需要一点帮助来完成我需要做的查询。
我的数据库结构如下所示。
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");
我认为用一个简单的查询无法做到这一点。
为什么:-你需要有办法知道所有的成分是否都在你的成分串内。使用具有的
不会解决的问题是不同的食谱将具有不同量的成分。
我不太熟悉JPA是如何工作的,但是在纯sql中,例如mysql,您可以在使用新查询处理数据之前使用view
来组织数据。
很抱歉,在JPA中,我无法帮助您解决这个问题。
看起来您需要以下内容的报价:
... 成分名称在(‘牛奶’、‘面粉’、‘鸡蛋’)组中由。。。。