【问题标题】:JPA: Check if Collection has member with propertyJPA:检查 Collection 是否具有具有属性的成员
【发布时间】:2020-08-26 11:34:54
【问题描述】:

在我的软件中,我有一个实体(我们称之为Member)和另一个实体的集合(我们称之为State)。我需要编写的查询应该返回所有没有State 且具有特定属性值的成员(例如5)。

以下是实体的相关部分:

public class Member {
    @JoinColumn(name = "MEMBER_ID")
    @OneToMany
    private List<State> states;

    @Column
    private String name;
}

public class State {
    @Column
    private int property;
}

请注意,Member 和 State 之间没有双向映射,映射是在关系的非拥有方 (Member) 上声明的。在 SQL 中,我会创建一个这样的查询:

SELECT m.name
FROM Member m
WHERE NOT EXISTS (
    SELECT *
    FROM State s
    WHERE
        m.id = s.member_id
        AND s.property = 5
);

但我不知道有任何方法可以在 JPQL 中实现相同的事情,而无需在关系的拥有方进行映射。有什么方法可以实现这一点而不必费心双向映射?

【问题讨论】:

    标签: java hibernate jpa jpql


    【解决方案1】:

    JPA 允许在子查询 from 子句中使用集合引用,所以你可以使用这个:

    SELECT m.name 
    FROM Member m 
    WHERE NOT EXISTS(
        SELECT 1 
        FROM m.states s 
        WHERE s.property = 5
    )
    

    这将生成您想要的 SQL。

    【讨论】:

      【解决方案2】:

      你可以这样写原生查询

      从 member_id 不在的成员中选择名称(从州中选择 id 其中属性 = 5)

      【讨论】:

        【解决方案3】:

        试试这样的

        select m.name from Member m where not exists(
            from Member m1 join m1.states s where s.property = 5
        )
        

        或

        select m.name from Member m where m.id not in(
            select m1.id from Member m1 join m1.states s where s.property = 5
        )
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-07-28
          • 1970-01-01
          • 2020-07-08
          • 2020-07-09
          • 2020-06-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多