如何在JPQL

时间:2019-02-07 10:47:01

标签: java hibernate jpa jpa-2.0 jpql

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

我已经像本机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条件下。

1 个答案:

答案 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