返回涉及多对多关系的实体的 JPQL 查询
Posted
技术标签:
【中文标题】返回涉及多对多关系的实体的 JPQL 查询【英文标题】:JPQL query that returns entities involving a many to many relationship 【发布时间】:2017-09-03 18:35:47 【问题描述】:我需要一个返回的 JPQL 查询:
我发布的所有推文 我关注的用户发布的所有推文(这是多对多部分)我尝试了类似的方法:
SELECT t
FROM Tweet t
WHERE t.author.id = :userId
OR t.author.id IN (
SELECT u.followedUsers
FROM User u
WHERE u.id = :userId
)
才发现子查询有wrong syntax。我也不能像在 SQL 中那样调用关系表 User_User,因为 JPA 无法识别它
用户
@Entity
public class User
@Id
@GeneratedValue
private long id
@ManyToMany(mappedBy = "followedUsers")
private Set<User> followers;
@ManyToMany
private Set<User> followedUsers;
推特
@Entity
public class Tweet
@Id
@GeneratedValue
private long id;
@ManyToOne
private User author;
【问题讨论】:
建议你看看更像t.author MEMBER OF collection field
的东西
【参考方案1】:
我有让 JPQL 查询更类似于 SQL 查询的习惯。所以,我的建议:
SELECT t FROM Tweet t
JOIN t.author a
WHERE a.id = :idUser
OR a.id IN (SELECT followedUser.id
FROM User u
JOIN u.followedUsers followedUser
WHERE u.id = :idUser)
【讨论】:
我没有考虑加入这些表,因为您知道,JPA 主要处理实体之间的关系。您的回答使查询非常可读,这很好。这种方法也有效。【参考方案2】:给定这个查询
OR t.author.id IN (
SELECT u.followedUsers
FROM User u
WHERE u.id = :userId
)
您正试图在User
对象列表中查找整数(t.author.id)
!
我认为这应该可行:
SELECT t
FROM Tweet t
WHERE t.author.id = :userId
OR t.author MEMBER OF (
SELECT u.followedUsers
FROM User u
WHERE u.id = :userId
)
编辑
... MEMBER OF (subquery)...
是不允许的,但是将子查询合并到它的父查询可以解决这个问题。
SELECT DISTINCT(t)
FROM Tweet t, User u
WHERE t.author.id = :userId
OR (t.author MEMBER OF u.followedUsers AND u.id = :userId)
【讨论】:
没错,我将整数与用户进行了比较。它应该是t.author.id IN :collectionOfIntegers
或t.author MEMBER OF :collectionOfUsers
。顺便说一句,这两个示例都有效,但是我必须知道我在关注谁并事先发送另一个查询。你的猜测... MEMBER OF (SELECT...
给出了compilation error,但你已经接近了。 JPQL 不接受那里的子查询,所以我尝试合并它。 SELECT DISTINCT(t) FROM Tweet t, User u WHERE t.author.id = :userId OR (t.author MEMBER OF u.followedUsers AND u.id = :userId)
这是为我做的!以上是关于返回涉及多对多关系的实体的 JPQL 查询的主要内容,如果未能解决你的问题,请参考以下文章