我正在做一个学校项目,所以我真的不是一个高级程序员,需要一些我需要的查询帮助。
我的数据库结构如下所示。
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");
答案 0 :(得分:1)
我认为你不能通过一个简单的查询来做到这一点。
为什么:
- 你需要知道所有成分是否在你的成分串中。
使用having
无法解决问题,不同的食谱会有不同的成分。
我不太熟悉JPA的工作原理,但在纯sql(例如mysql)中,您可以使用view
来组织数据,然后再使用新查询处理数据。
我很抱歉,我无法帮助您解决JPA中的查询问题。
答案 1 :(得分:0)
看起来你需要引号:
...在(&#39;牛奶&#39;,&#39;面粉&#39;,#39;鸡蛋&#39;)组中的Ingredient.name被....