返回涉及多对多关系的实体的 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 :collectionOfIntegerst.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 查询的主要内容,如果未能解决你的问题,请参考以下文章

多对多关系中没有项目的实体的 JPQL

JPQL 多对多 Dto 选择失败

JPQL 基于条件的多对多连接

JPQL查询多对多连接表

具有多对多关系的 JPQL 查询

JPA 多对多JPQL查询语句怎么写?