지금까지 성공하지 못했지만 SQL 쿼리를 Criteria API로 변환하려고합니다. 필요한 값을 반환하는 두 개의 개별 쿼리를 만들 수 있지만 단일 쿼리에서 이들을 결합하는 방법을 모르겠습니다.JPA 2 + Criteria API - 하위 쿼리 정의
: 나는 작은 래퍼/헬퍼 클래스를 정의 된 응용 프로그램에서CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<intCompany> qTicket = cb.createQuery(intCompany.class);
Root<Ticket> from = qTicket.from(Ticket.class);
Path groupBy = from.get("company");
Predicate state = cb.notEqual(from.<State>get("state"), getStateById(16));
qTicket.select(cb.construct(
intCompany.class, cb.count(from),from.<Company>get("company")))
.where(state).groupBy(groupBy);
em.createQuery(qTicket).getResultList();
:
select company.*, ticketcount.counter from company
join
(select company, COUNT(*) as counter from ticket where state<16 group by company) ticketcount
on company.compid = ticketcount.company;
이 기준 쿼리는 내부 쿼리 결과를 반환 여기
가 작동하는 SQL 문이다public class intCompany{
public Company comp;
public Long opentickets;
public intCompany(Long opentickets,Company comp){
this.comp = comp;
this.opentickets = opentickets;
}
public intCompany(){
}
}
누구나 어떻게 작동하는지 알 수 있습니까?
업데이트 감사합니다. 내가 제안한 기준 쿼리를 변경했습니다. 마지막으로 원하는 정보를 얻으려면 루프를 추가해야했습니다.
List<intCompany> result = em.createQuery(cq).getResultList();
List<Company> cresult = new ArrayList();
for(intCompany ic: result){
ic.comp.setOpentickets(ic.opentickets.intValue());
cresult.add(ic.comp);
}
return cresult;
아마도 원래 SQL을 Criteria API로 변환 할 수 없을 수도 있습니다.
내가 그렇지 않으면 내가 티켓 테이블에 항목이없는 회사를하지 않는
select company.*, ticketcount.counter from company
left join
(select company, COUNT(*) as counter from ticket where state<16 group by company) ticketcount
on company.compid = ticketcount.company;
원래 SQL 식을 변경했다 알아 냈
또 다른 갱신.
다른 제안 사항이 있습니까?