我尝试将SQL查询转换为Criteria API,但目前为止没有成功。我可以创建两个单独的查询来返回我需要的值,但我不知道如何将它们合并到一个查询中。JPA 2 + Criteria API - 定义子查询
这里是sql语句,其工作原理:
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;
此条件查询返回内部查询结果:
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();
在我定义了一个小包装/辅助类应用:
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。
另一个更新
我想通了,我不得不把原来的SQL表达式更改为
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;
否则我不明白公司与中票表中没有条目。
那么还有其他建议吗?