4

私はQueryDSLにかなり慣れていないので、これは簡単なことかもしれません。データベースには次の構造があります。

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

ここで、特定のユーザーと共通のアイテムを少なくとも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.in(subQuery.list(item))).list(user);

しかし、subquery.list()はList <Item>ではなく、ListSubQuery <Item>を返すため、これにより'in'句に問題が発生します。どんな助けでも本当にありがたいです。

編集

Timoに感謝します。あなたの提案は機能しますが、残念ながら、この種のサブクエリが複数ある場合、結果のステートメントは次のようにはるかに遅くなります。

User myUser = repository.findOne(myUserId);

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

1 に答える 1

4

代わりにこれを試してください

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);
于 2012-05-23T18:06:51.013 に答える