Tôi cố chuyển đổi truy vấn sql thành API tiêu chí mà không thành công cho đến thời điểm này. Tôi có thể tạo hai truy vấn riêng biệt trả về các giá trị tôi cần, nhưng tôi không biết cách kết hợp chúng trong một truy vấn đơn lẻ.JPA 2 + API tiêu chí - Xác định truy vấn phụ
Đây là câu lệnh SQL mà hoạt động:
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;
truy vấn Tiêu chuẩn này sẽ trả về kết quả truy vấn bên trong:
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();
Trong ứng dụng tôi định nghĩa một lớp wrapper/helper nhỏ:
public class intCompany{
public Company comp;
public Long opentickets;
public intCompany(Long opentickets,Company comp){
this.comp = comp;
this.opentickets = opentickets;
}
public intCompany(){
}
}
Vì vậy, có ai có ý tưởng về cách làm việc này không?
Cập nhật
Cảm ơn bạn. Tôi đã thay đổi truy vấn tiêu chí của mình như bạn đã đề xuất. Tôi chỉ cần thêm một vòng lặp ở cuối để có được thông tin tôi muốn.
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;
Có thể bạn không thể chuyển đổi sql ban đầu thành API tiêu chí.
Một cập nhật
tôi đã tìm ra tôi đã phải thay đổi biểu thức sql gốc để
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;
Nếu tôi không nhận được các công ty không có mục trong bảng vé.
Vì vậy, có đề xuất nào khác không?