Play Framework 2.x Ebean 查询 ManyToMany for all

Play Framework 2.x Ebean query ManyToMany for all

我在 Play Framework 2/Ebean 中有两个模型,'Article' 和 'Tag',它们之间存在多对多关系。

文章:

@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) 查找包含列表中 Any 标签的所有文章,但我希望更具体

只需使用 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();