使用聚合函数时,在hibernate中从多个表中选择列

时间:2015-12-21 18:49:19

标签: mysql database hibernate hql

我有以下架构

Table: Product Columns : Product_ID Product_Name

Table: Sales_Detail Columns : Sales_Detail_ID Product_ID Quantity Total_Sales .. ..

我想要做的是使用以下查询显示每日销售额。 SELECT Prouduct_ID, SUM(sd.Quantity), SUM(sd.Selling_Rate) FROM SalesDetail sd WHERE DATE(Date_Time)=CURDATE() GROUP BY Product_ID

从结果中获取产品名称和产品ID。我怎么做。我浏览了互联网上的资源,但非可以帮助我找到正确的方法。

2 个答案:

答案 0 :(得分:0)

我实际上没有Hibernate来测试它,但是这个HQL查询可能是一个好的开始:

SELECT
  sd.Product_ID,
  p.Product_Name,
  SUM(sd.Quantity),
  SUM(sd.Selling_Rate)
FROM
  SalesDetail sd
INNER JOIN Product p 
WHERE
  p.Product_ID = sd.Product_ID AND
  sd.Date_Time > CURRENT_DATE()
GROUP BY
  sd.Product_ID, p.Product_Name

我不知道Date_Time来自哪里,但我在猜表SalesDetail

我不确定DATE(Date_Time)是否可行,所以我使用了sd.Date_Time > CURRENT_DATE(),但您应该计算出HQL的时间范围,而是使用类似sd.Date_Time BETWEEN :dateTimeStart AND :dateTimeEnd的内容。有关如何绑定日期参数的详细信息,请参阅HQL to query records between two dates

答案 1 :(得分:0)

好的,这就是我所做的,它解决了我的问题。这实际上很简单但很棘手。

主要关注SELECT查询。这里productHeader是ProductHeader类的对象,它引用数据库中的product_header命名表。 Product_ID product_header表的主键选为productHeader.Product_ID(PRODUCT_HEADER_OBJECT.PRIMARY_KEY_ATTRIBUTE)

        Session session = null;
        try{
            session = sessionFactory.openSession();
            session.beginTransaction();

            /*Query to get the daily sales report. This query will provide current date as input and sum the total product quanitity sold and total sales selling rate*/
            Query query = session.createQuery("SELECT productHeader.Product_ID, SUM(s.Quantity) as Quantity, SUM(Total) FROM SalesDetail s WHERE DATE(Date_Time)=CURDATE() GROUP BY Product_ID");

            List<Object[]> groupList = query.list();
            session.getTransaction().commit();
            session.close();
            ProductHeader productHeader = new ProductHeader();

            for(Object[] arr : groupList){
                productHeader =null;
                String productID = (String) arr[0]; //the first index in the object array list is productID 
                                                    //as it is the first one defined in the HQL query above
                double quantity = (double) arr[1];
                double totalSales = (double)arr[2];

                session = sessionFactory.openSession();
                session.beginTransaction();

                /*Getting the product header class by passing primary key value to session.get() method*/
                productHeader = (ProductHeader) session.get(ProductHeader.class, productID);
                String productName = productHeader.getProduct_Name();


                DailySales dailySales= new DailySales();
                dailySales.setSn(billSN);
                dailySales.setProductID(productID);
                dailySales.setPrductName(productName);
                dailySales.setQuantitySold(quantity);
                dailySales.setSalesAmount(totalSales);
                data.add(dailySales);

                tblDailySales.setItems(data);
                System.out.println("From object parsing "+Arrays.toString(arr));
            }

        } catch (Exception e) {
            System.out.println("Error while populating daily sales table : " + e.getMessage());
        }