我在Play Framework 2 / Ebean中有两个模型,'Article'和'Tag',它们之间具有ManyToMany关系。
文章:
@Entity
public class Article extends Model {
@ManyToMany
List<Tag> tags;
// ...
}
标签:
@Entity
public class Tag extends Model {
@ManyToMany
List<Article> articles;
// ...
}
鉴于List<Tag>
,如何为列表中包含所有标记的文章撰写查询?
我知道我可以使用Article.find().where().in("tags", tags)
查找列表中包含任何标记的所有文章,但我希望更具体
答案 0 :(得分:2)
只需使用RawSql查询;一旦你开始加入并添加了许多条款,事情就会很快失控。在那时,编写一个难以调试的查询变得非常容易,将来甚至难以修改。最后,您的查询仍然会变成一个SQL查询,除了满足好奇心以查看是否可以完成之外,您不会为自己节省太多。
设置字符串sql=
SELECT a.id
FROM ARTICLE_TAG a
JOIN TAG t ON t.id = a.tag_id
WHERE t.name IN ( :tags )
GROUP BY a.id
HAVING COUNT(DISTINCT t.name) = :num_tags
然后这样做:
RawSql rawSql =
RawSqlBuilder
.parse(sql)
.columnMapping("a.id", "id")
.create();
List<Article> articles = Ebean.find(Article.class)
.setRawSql(rawSql)
.setParameter("tags", tags)
.setParameter("num_tags", tags.length)
.findList();