Querydsl Many2many加入

时间:2012-05-22 18:02:21

标签: jpa many-to-many subquery querydsl

我是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< Item>但是ListSubQuery< Item>。任何帮助都会非常感激。

修改

谢谢蒂莫,你的建议有效 - 但不幸的是,如果你有多个这样的子查询,那么结果语句要慢得多:

User myUser = repository.findOne(myUserId);

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

1 个答案:

答案 0 :(得分:2)

试试这个

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);