我的模型中存在一对多关系,其中包含主实体和详细实体。我需要构造持久性查询,以便仅查询具有某些详细信息行的那些主行。
我已经像本机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条件下。
答案 0 :(得分:1)
在JPQL中,您可以像这样加入相关实体:
SELECT r FROM JMSRequest r
JOIN r.sedJMSActions a
WHERE a.status=1
GROUP BY r.id
HAVING SUM(a.requestAction)!=r.requestAction