我的模型中存在一对多关系,具有主实体和细节实体。我需要构造持久性查询,以便仅查询那些具有某些详细信息行的主行。
我已经编写了像本机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