如何在 JPQL 中重写 where 子查询条件



我的模型中存在一对多关系,具有主实体和细节实体。我需要构造持久性查询,以便仅查询那些具有某些详细信息行的主行。

我已经编写了像本机SQL查询一样的持久性查询,但它似乎不是最佳的。

简化的主实体

@Entity
@Table(name = "SED_JMS_REQUESTS")
public class JMSRequest{
@Id
private Long id;
@OneToMany(fetch = FetchType.EAGER,
        targetEntity=JMSAction.class, mappedBy="ownerRequest")
private Set<JMSAction> sedJMSActions;
@Column(name = "REQUEST_ACTION")
@Min(1)
private Integer requestAction;    
...
}

简化的详细图元

@Entity
@Table(name = "SED_JMS_ACTIONS")
public class JMSAction{
    @Id
    private Long id;
@ManyToOne(fetch= FetchType.LAZY)
@JoinColumn(name = "REQUESTID")
private JMSRequest ownerRequest;
@Column(name = "REQUESTID",insertable=false,updatable=false)
private Long requestId;
@Basic(optional = false)
@Column(name = "REQUEST_ACTION")
private Integer requestAction;
...
}

适当的本机 SQL 查询,它正在工作

select * from SED_JMS_requests r
where (select nvl(sum(a.request_Action),0) from SED_JMS_ACTIONS a where a.requestid=r.id and a.status=1) = r.request_Action

构造的持久性查询类似于上述本机 SQL 查询

select r From JMSRequest r where  ((select NVL(SUM(a.requestAction),0) from JMSAction a where a.requestId = r.id and a.status=1) != r.requestAction) 

我已经编写了持久性查询,它只是类似于本机SQL查询。它正在工作,但对我来说它不是最佳的,因为细节实体已经加入,因为@ManyToOne蜂急切地获取。因此,生成的持久性查询包含两次详细信息实体,一次作为联接实体,一次作为 where 条件。

在 JPQL 中,你可以像这样加入相关实体:

SELECT r FROM JMSRequest r
JOIN r.sedJMSActions a
WHERE a.status=1
GROUP BY r.id
HAVING SUM(a.requestAction)!=r.requestAction

最新更新