Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa 按时间戳作为日期的JPQL组_Jpa_Jpql - Fatal编程技术网

Jpa 按时间戳作为日期的JPQL组

Jpa 按时间戳作为日期的JPQL组,jpa,jpql,Jpa,Jpql,在JPA应用程序中,票据实体有一个名为createAt的属性,带有时间戳注释 我想按createdAt仅按日期而不是按时间戳对账单进行分组 在查询中,虽然我将TemporalType传递为Date,但仍将账单分组为Time 如何使用createdAt属性按日期对账单进行分组 我使用JPA和EclipseLink 2.5 票据实体 @Entity public class Bill implements Serializable { .... .... @Temporal

在JPA应用程序中,票据实体有一个名为createAt的属性,带有时间戳注释

我想按createdAt仅按日期而不是按时间戳对账单进行分组

在查询中,虽然我将TemporalType传递为Date,但仍将账单分组为Time

如何使用createdAt属性按日期对账单进行分组

我使用JPA和EclipseLink 2.5

票据实体

@Entity
public class Bill implements Serializable {
    ....
    ....

    @Temporal(javax.persistence.TemporalType.TIMESTAMP)
    Date createdAt;

    ....
    ....
}
这是用于列出账单的方法

public String listProfitBillsDailySummery() {
    System.out.println("list profit bills");
    String jpql = "SELECT new com.divudi.data.DailySummeryRow(b.createdAt, b.freeValue, b.netTotal, b.discount) "
            + " FROM Bill b "
            + " WHERE (type(b)=:bc1 or type(b)=:bc2 or type(b)=:bc3 ) "
            + " and b.retired=false "
            + " and (b.billType=:bt1 or b.billType=:bt2 or b.billType=:bt3) "
            + " and b.createdAt between :fromDate and :toDate ";

    Map temMap = new HashMap();

    if (department != null) {
        jpql += " and b.department=:d ";
        temMap.put("d", department);
    }

    jpql += " group by b.createdAt "
            + "order by b.deptId  ";

    temMap.put("bc1", BilledBill.class);
    temMap.put("bc2", RefundBill.class);
    temMap.put("bc3", CancelledBill.class);

    temMap.put("bt1", BillType.PharmacyPurchaseBill);
    temMap.put("bt2", BillType.PharmacyGrnBill);
    temMap.put("bt3", BillType.PharmacySale);

    temMap.put("fromDate", getFromDate());
    temMap.put("toDate", getToDate());

    List<Object[]> dsso = getBillFacade().findAggregates(jpql, temMap, TemporalType.DATE);
    profitTotal = 0.0;
    discountTotal = 0.0;
    freeTotal =0.0;
    dailySummeryRows = new ArrayList<>();
    for (Object b : dsso) {
        DailySummeryRow dsr = (DailySummeryRow) b;
        profitTotal += dsr.getProfit();
        discountTotal += dsr.getDiscounts();
        freeTotal += dsr.getFreeAmounts();
        dailySummeryRows.add(dsr);
    }
    return "pharmacy_report_gross_profit_by_bills_ds";
}
公共字符串列表ProfitBillsDailySummery(){
System.out.println(“列出利润清单”);
String jpql=“选择新建com.divudi.data.DailySummeryRow(b.createdAt,b.freeValue,b.netTotal,b.discount)”
+“来自比尔b”
+其中(类型(b)=:bc1或类型(b)=:bc2或类型(b)=:bc3)
+“和b.retired=false”
+“和(b.billType=:bt1或b.billType=:bt2或b.billType=:bt3)”
+“和b.createdAt介于:fromDate和:toDate之间”;
Map temMap=newhashmap();
如果(部门!=null){
jpql+=“和b.department=:d”;
temMap.put(“d”,部门);
}
jpql+=“按b.createdAt分组”
+“b.deptId订购”;
temMap.put(“bc1”,BilledBill.class);
temMap.put(“bc2”,退款账单类);
temMap.put(“bc3”,已取消票据类);
temMap.put(“bt1”,BillType.PharmacyPurchaseBill);
temMap.put(“bt2”,BillType.PharmacyGrnBill);
temMap.put(“bt3”,BillType.PharmacySale);
put(“fromDate”,getFromDate());
put(“toDate”,getToDate());
List dsso=getBillFacade().findAggregates(jpql、temMap、TemporalType.DATE);
profitTotal=0.0;
折扣总额=0.0;
freeTotal=0.0;
dailySummeryRows=新的ArrayList();
用于(对象b:dsso){
DailySummeryRow dsr=(DailySummeryRow)b;
profitTotal+=dsr.getProfit();
折扣总额+=dsr.get折扣();
freeTotal+=dsr.getFreeAmounts();
添加(dsr);
}
返回“药房报表、毛利、账单”;
}
这是会话Bean中的方法

public List<Object[]> findAggregates(String temSQL, Map<String, Object> parameters, TemporalType tt) {
        TypedQuery<Object[]> qry = getEntityManager().createQuery(temSQL, Object[].class);
        Set s = parameters.entrySet();
        Iterator it = s.iterator();
        while (it.hasNext()) {
            Map.Entry m = (Map.Entry) it.next();
            Object pVal =  m.getValue();
            String pPara = (String) m.getKey();
            if(pVal instanceof Date){
                Date pDate = (Date) pVal;
                qry.setParameter(pPara, pDate, TemporalType.DATE);
            }else{
                qry.setParameter(pPara, pVal);
            }
        }
        try {
            return qry.getResultList();
        } catch (Exception e) {
            System.out.println("e = " + e);
            return null;
        }
    }
public List findaggerates(字符串temSQL、映射参数、临时类型tt){
TypedQuery qry=getEntityManager().createQuery(temSQL,Object[].class);
Set s=parameters.entrySet();
迭代器it=s.Iterator();
while(it.hasNext()){
Map.Entry m=(Map.Entry)it.next();
对象pVal=m.getValue();
字符串pPara=(字符串)m.getKey();
if(pVal实例生效日期){
日期pDate=(日期)pVal;
qry.setParameter(pPara、更新日期、时间类型日期);
}否则{
qry.setParameter(pPara,pVal);
}
}
试一试{
返回qry.getResultList();
}捕获(例外e){
System.out.println(“e=“+e”);
返回null;
}
}
我使用FUNC('Date',b.createdAt)按日期分组

public String listProfitBillsDailySummery() {
    System.out.println("list profit bills");
    String jpql;
     jpql = "SELECT new com.divudi.data.DailySummeryRow(FUNC('DATE',b.createdAt), b.freeValue, b.netTotal, b.discount) "
            + " FROM Bill b "
            + " WHERE (type(b)=:bc1 or type(b)=:bc2 or type(b)=:bc3 ) "
            + " and b.retired=false "
            + " and (b.billType=:bt1 or b.billType=:bt2 or b.billType=:bt3) "
            + " and FUNC('DATE',b.createdAt) between :fromDate and :toDate ";

    Map temMap = new HashMap();

    if (department != null) {
        jpql += " and b.department=:d ";
        temMap.put("d", department);
    }

    jpql += " group by FUNC('DATE',b.createdAt) "
            + "order by FUNC('DATE',b.createdAt)  ";

    temMap.put("bc1", BilledBill.class);
    temMap.put("bc2", RefundBill.class);
    temMap.put("bc3", CancelledBill.class);

    temMap.put("bt1", BillType.PharmacyPurchaseBill);
    temMap.put("bt2", BillType.PharmacyGrnBill);
    temMap.put("bt3", BillType.PharmacySale);

    temMap.put("fromDate", getFromDate());
    temMap.put("toDate", getToDate());

    List<Object[]> dsso = getBillFacade().findAggregates(jpql, temMap, TemporalType.DATE);
    profitTotal = 0.0;
    discountTotal = 0.0;
    freeTotal =0.0;
    dailySummeryRows = new ArrayList<>();
    if(dsso==null){
        dsso = new ArrayList<>();
        System.out.println("new list as null");
    }
    for (Object b : dsso) {
        DailySummeryRow dsr = (DailySummeryRow) b;
        profitTotal += dsr.getProfit();
        discountTotal += dsr.getDiscounts();
        freeTotal += dsr.getFreeAmounts();
        dailySummeryRows.add(dsr);
    }
    return "pharmacy_report_gross_profit_by_bills_ds";
}
公共字符串列表ProfitBillsDailySummery(){
System.out.println(“列出利润清单”);
字符串jpql;
jpql=“选择新建com.divudi.data.DailySummeryRow(FUNC('DATE',b.createdAt),b.freeValue,b.netTotal,b.discount)”
+“来自比尔b”
+其中(类型(b)=:bc1或类型(b)=:bc2或类型(b)=:bc3)
+“和b.retired=false”
+“和(b.billType=:bt1或b.billType=:bt2或b.billType=:bt3)”
+“和FUNC('DATE',b.createdAt)介于:fromDate和:toDate之间”;
Map temMap=newhashmap();
如果(部门!=null){
jpql+=“和b.department=:d”;
temMap.put(“d”,部门);
}
jpql+=“按FUNC分组('DATE',b.createdAt)”
+“按FUNC(“日期”,b.createdAt)订购”;
temMap.put(“bc1”,BilledBill.class);
temMap.put(“bc2”,退款账单类);
temMap.put(“bc3”,已取消票据类);
temMap.put(“bt1”,BillType.PharmacyPurchaseBill);
temMap.put(“bt2”,BillType.PharmacyGrnBill);
temMap.put(“bt3”,BillType.PharmacySale);
put(“fromDate”,getFromDate());
put(“toDate”,getToDate());
List dsso=getBillFacade().findAggregates(jpql、temMap、TemporalType.DATE);
profitTotal=0.0;
折扣总额=0.0;
freeTotal=0.0;
dailySummeryRows=新的ArrayList();
if(dsso==null){
dsso=新的ArrayList();
System.out.println(“新列表为空”);
}
用于(对象b:dsso){
DailySummeryRow dsr=(DailySummeryRow)b;
profitTotal+=dsr.getProfit();
折扣总额+=dsr.get折扣();
freeTotal+=dsr.getFreeAmounts();
添加(dsr);
}
返回“药房报表、毛利、账单”;
}

时间戳和日期之间的区别不是你想的那样。在这里查看:谢谢。我用创建的时间记录账单。但我想得到账单的详细信息,比如总金额或折扣,按日期分组。这就是我要解决的问题。然后,当您
分组时,需要从列中提取日期,这很酷。但请记住
Func
是特定于供应商(EclipseLink)的,而不是来自纯JPA。因此,如果更改ORM,可能也需要更改查询。