我有一个JSF应用程序,它使用JPA来管理数据库事务。
在我的数据结构中有账单[Bill]。一个账单可以有很多账单项[BillItem]。 Bill项目与Item有关系。票据可能有机构和收集中心。但在某些法案中,两者都可以为空。我想按项目,机构和收集中心对账单项目进行分组并获取计数。以下jpql仅列出具有机构和收集中心的那些。这意味着它不会对空值进行分组。
我使用EclipseLink 2.4和MySQL。
String jpql;
Map m = new HashMap();
jpql = "Select new com.divudi.data.dataStructure.ItemInstitutionCollectingCentreCountRow(bi.item, bi.bill.institution, bi.bill.collectingCentre, count(bi)) "
+ " from BillItem bi "
+ " where bi.bill.createdAt between :fd and :td "
+ " and type(bi.item) =:ixbt "
+ " and bi.retired=false "
+ " and bi.bill.retired=false "
+ " and bi.bill.cancelled=false "
+ " and bi.retired=false ";
jpql = jpql + " group by bi.item, bi.bill.institution, bi.bill.collectingCentre";
jpql = jpql + " order by bi.bill.institution.name, bi.bill.collectingCentre.name, bi.item.name ";
m.put("fd", fromDate);
m.put("td", toDate);
m.put("ixbt", Investigation.class);
insInvestigationCountRows = (List<ItemInstitutionCollectingCentreCountRow>) (Object) billFacade.findAggregates(jpql, m, TemporalType.DATE);
System.out.println("sql = " + jpql);
System.out.println("m = " + m);
System.out.println("insInvestigationCountRows.size() = " + insInvestigationCountRows.size());
答案 0 :(得分:2)
在关系之间使用点意味着内部联接将过滤掉空值。如果要在关系中允许空值,则必须明确使用外部连接:
"Select count(bi) from BillItem bi JOIN bi.item item LEFT JOIN bi.bill bill LEFT JOIN bill.institution institution LEFT JOIN bill.collectingCentre collectingCentre group by item, institution, collectingCentre"