Как переписать, где условие подзапроса в JPQL - PullRequest
0 голосов
/ 07 февраля 2019

В моей модели есть отношение «один ко многим» с сущностями мастера и детализации.Мне нужно построить запрос постоянства так, чтобы запрашивались только те основные строки, которые имеют определенные строки подробностей.

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

1 Ответ

0 голосов
/ 22 февраля 2019

В JPQL вы можете присоединиться к связанным сущностям, например:

SELECT r FROM JMSRequest r
JOIN r.sedJMSActions a
WHERE a.status=1
GROUP BY r.id
HAVING SUM(a.requestAction)!=r.requestAction
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...