【问题标题】:Play Framework 2.x Ebean query ManyToMany for allPlay Framework 2.x Ebean 查询 ManyToMany for all
【发布时间】:2015-05-20 10:23:23
【问题描述】:

我在 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&lt;Tag&gt;,我如何为包含列表中所有标签的文章编写查询?

我知道我可以使用Article.find().where().in("tags", tags) 来查找包含列表中任何标签的所有文章,但我希望更具体

【问题讨论】:

  • 您是否尝试过从其他角度解决问题并使用 SQL 查询来获取此信息?
  • 不,如果一切都失败了,我一直将其保存为最后一个选项:) 但它开始看起来可能是唯一的选择。我希望有一些明显的方法可以通过我缺少的 Ebean 实现这一点。

标签: java orm playframework-2.0 ebean


【解决方案1】:

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

【讨论】:

  • 很好的答案!您几乎可以争辩说,即使 一种方法可以仅使用 Ebean 来执行此操作,但还是会首选 RawSql 查询,因为它更易于阅读调试。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
相关资源
最近更新 更多