Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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
Java HQL中的Group By和Sum结果_Java_Hibernate_Jakarta Ee_Hql - Fatal编程技术网

Java HQL中的Group By和Sum结果

Java HQL中的Group By和Sum结果,java,hibernate,jakarta-ee,hql,Java,Hibernate,Jakarta Ee,Hql,表car用于保存car数据,并具有来自表项目的外键。表car_log用于保存car log中的每个移动。我已经为每个表创建了对象。 在本例中,我希望在项目中显示每辆车每天的间隙总和。 当我想选择项目1中每辆车的摘要时,这是我的查询 CREATE TABLE project( Id int auto_increment primary key, Name char(50) NOT NULL )ENGINE = InnoDB; CREATE TABLE car( Id in

表car用于保存car数据,并具有来自表项目的外键。表car_log用于保存car log中的每个移动。我已经为每个表创建了对象。 在本例中,我希望在项目中显示每辆车每天的间隙总和。 当我想选择项目1中每辆车的摘要时,这是我的查询

CREATE TABLE project(
    Id int auto_increment primary key,
    Name char(50) NOT NULL
)ENGINE = InnoDB;

CREATE TABLE car(
    Id int auto_increment primary key,
    ProjectId int(11) NOT NULL,
    Plate char(10) NOT NULL,
    Latitude varchar(50) DEFAULT '-6.221165',
    Longitude varchar(50) DEFAULT '106.833286',
    LastTemp varchar(20) DEFAULT '0',
    LastSpeed varchar(20) DEFAULT '0',
    LastGap double DEFAULT 0,
    Mileage double DEFAULT 0,
    CONSTRAINT fk_car_project FOREIGN KEY(ProjectId)REFERENCES project(Id) ON UPDATE CASCADE
)ENGINE = InnoDB;

CREATE TABLE car_log(
    Id int auto_increment primary key,
    CarId int NOT NULL,
    Latitude varchar(50),
    Longitude varchar(50),
    Temp varchar(20),
    Speed varchar(20),
    Gap double DEFAULT 0,
    LogDate TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_carlog_car FOREIGN KEY(CarId)REFERENCES car(Id) ON UPDATE CASCADE
 )
但我不知道如何在HQL中处理这个问题。我试图创建一个新对象来处理这个问题,但使用起来很混乱。我想问一下如何解决这个问题

select CarId, DATE(LogDate) dateOnly, sum(Gap)/1000 KM from car_log where CarId IN (SELECT Id FROM car where ProjectId = 1) group by CarId, dateOnly;

在查询中,只需将表名替换为实体名,将表列名替换为实体属性

public class CarLogDate {
    private double km;
    private Date date;
    //constructor & setter getter
}

在查询中,只需将表名替换为实体名,将表列名替换为实体属性

public class CarLogDate {
    private double km;
    private Date date;
    //constructor & setter getter
}
或者,您可以使用object[]作为参数来实例化该对象


或者您可以使用object[]a作为参数来实例化对象。

您有两次car表。您可以发布正确的代码吗对不起,谢谢您的修改。我已经编辑了我的代码,你试过我做的任何查询了吗。选择CarId,DATELogDate dateOnly,距离car_log 1000公里的sumGap,其中CarId位于从car中选择Id的位置,其中Projectd=1,按CarId分组,dateOnly;但我混淆了将结果转换为列表对象。您有两次car表。您可以发布正确的代码吗?对不起,谢谢您的修改。我已经编辑了我的代码,你试过我做的任何查询了吗。选择CarId,DATELogDate dateOnly,距离car_log 1000公里的sumGap,其中CarId位于从car中选择Id的位置,其中Projectd=1,按CarId分组,dateOnly;但我不知道如何将结果转换为列表对象谢谢。行得通,我试着在下面写下完整的答案谢谢。这是可行的,我试着把完整的答案写在下面
List<Object[]> q = sessionFactory.getCurrentSession().createQuery("SELECT O.car.id AS carId, DATE(O.logDate) AS dateOnly, sum(O.gap)/1000 AS Km from CarLog O " +
            "WHERE carId IN (SELECT id FROM Car c where c.project.id = 1) GROUP BY carId, DATE(O.logDate)").list();
for(Object[] a : q)
    System.out.println(a[0]+" "+a[1]+" "+a[2]);