【问题标题】:Querydsl Many2many joinQuerydsl Many2many join
【发布时间】:2012-05-22 18:02:20
【问题描述】:

我对 QueryDSL 比较陌生,所以这可能很简单。我的数据库中有以下结构:

 ______      ___________      _______
| user |    | user2item |    | item  |
|------|    |-----------|    |-------|
| id   |    | user_id   |    | id    |
| name |    | item_id   |    | name  |
 ------      -----------      -------

现在我想获取与给定用户至少有一项共同点的所有用户。所以我尝试了:

JPASubQuery subQuery = new JPASubQuery().from(user, item).join(user.items, item).where(user.id.eq(myUserId));
return new JPAQuery(entityManager).from(user).where(user.items.in(subQuery.list(item))).list(user);

但这在“in”子句中给我带来了问题,因为 subquery.list() 不返回 List 而是返回 ListSubQuery。任何帮助将不胜感激。

编辑

感谢 Timo,您的建议有效 - 但不幸的是,如果您有多个此类子查询,则生成的语句比:

User myUser = repository.findOne(myUserId);

return new JPAQuery(entityManager)
           .from(user)
           .join(user.items, item)
           .where(item.in(myUser.getItems()))
           .list(user);

【问题讨论】:

  • 好的,我会看看性能差异可能是什么原因。由于加入,您可能会得到重复的结果。
  • 嗨 Timo,我的例子稍微简化了一点来说明我的问题,所以如果我像我在这里写的那样进行查询(只有一个子查询,没有其他条件),速度还可以。但在我的实际应用程序中,我使用了两个此类子查询,这似乎打破了性能瓶颈。
  • 好的。您是否尝试过 item.in(myUser.getItems())?这至少更紧凑。
  • 我刚试过,看起来不错 - 非常感谢。

标签: jpa many-to-many subquery querydsl


【解决方案1】:

试试这个

JPASubQuery subQuery = new JPASubQuery()
  .from(user, item).join(user.items, item)
  .where(user.id.eq(myUserId));
return new JPAQuery(entityManager).from(user)
  .where(user.items.any().in(subQuery.list(item))).list(user);

【讨论】:

  • 蒂莫,感谢您的回答。我有类似的问题,有 user-many2many-roles 关系。我以这样的角色查询了所有用户:new JPAQuery(em).from(user).where(user.roles.any().name.eq("ADMIN")).list(user) 这有效,但它确实加入了太多:SELECT ... FROM user t0 WHERE EXISTS (SELECT * FROM userRoles t3, roles t2, roles t1 WHERE (((t1.id = t2.id) AND (t1.name = 'ADMIN')) AND ((t3.user_id = t0.id) AND (t2.id = t3.role_id)))); 它似乎在没有加入 t1 及其条件的情况下工作 - 真的没有必要在那里吗?在我的情况下,任何似乎都更具可读性。
猜你喜欢
  • 2019-06-06
  • 2015-05-05
  • 2015-01-11
  • 2019-06-02
  • 2018-12-04
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
  • 1970-01-01
相关资源
最近更新 更多