В моей модели есть отношение «один ко многим» с сущностями мастера и детализации.Мне нужно построить запрос постоянства так, чтобы запрашивались только те основные строки, которые имеют определенные строки подробностей.
Я составил запрос постоянства, как собственный 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 загружается с нетерпением.Таким образом, результирующий постоянный запрос содержит подробный объект дважды, один раз как присоединенный объект и еще раз в условии условия.