Play Framework 2.x Ebean查询ManyToMany

时间:2015-05-20 10:23:23

标签: java orm playframework-2.0 ebean

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

1 个答案:

答案 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();