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();
我在 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();