【发布时间】: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
编辑
感谢 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