Şimdiye kadar başarı olmadan bir sql sorgusunu Kriter API'sına dönüştürmeyi deniyorum. İhtiyacım olan değerleri döndüren iki ayrı sorgu oluşturabilirim, ancak bunları tek bir sorguda nasıl birleştireceğimi bilmiyorum.JPA 2 + Kriter API - Bir alt sorgunun tanımlanması
: Ben küçük bir sarmalayıcı/yardımcı sınıf tanımlı uygulamasındaCriteriaBuilder 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;
Bu Kriterler sorgusu iç sorgu sonuçları verir: Burada
çalışır sql ifadesipublic class intCompany{
public Company comp;
public Long opentickets;
public intCompany(Long opentickets,Company comp){
this.comp = comp;
this.opentickets = opentickets;
}
public intCompany(){
}
}
Peki, bu çalışmayı nasıl alacağına dair bir fikri olan var mı?
Güncelleme teşekkür ederiz. Kriterlerimi önerdiğin gibi değiştirdim. Sonunda istediğim bilgiyi almak için bir döngü eklemem gerekiyordu.
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;
Belki Kriterler API orijinal sql dönüştürmek için sadece mümkün değildir.
ben Aksi takdirde bilet tabloda hiç girişlerle şirketleri alamadım
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;
orijinal sql ifadesini değiştirmek zorunda anladım
Diğer bir güncelleme.
Başka önerileriniz var mı?