0
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
 )

テーブル car は車のデータを保存するために使用され、テーブル プロジェクトからの外部キーを持っています。車内のすべての動きを保存するために使用されるテーブル car_log (ログ)。このテーブルごとにオブジェクトを作成しました。この場合、プロジェクトで各車の概要 (1 日あたりの Gap の合計) を表示したいと考えています。これは、プロジェクト 1 の各車の概要を選択したいときのクエリです。

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;

しかし、HQLでこれを処理する方法を混乱させます。これを処理するために新しいオブジェクトを作成しようとしましたが、それを使用するのが混乱しています。そして、これを解決する方法をお聞きしたいのですが、

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

2 に答える 2

2

クエリでは、テーブル名をエンティティ名に置き換え、テーブルの列名をエンティティ プロパティに置き換えるだけです。

List<Object[]> list = 
    select CarId, LogDate dateOnly, sum(Gap)/1000 KM
    from CarLogDate
    where CarId IN
        (SELECT Id FROM car where ProjectId = 1)
    group by CarId, dateOnly;
于 2013-03-22T04:59:57.363 に答える
1
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]);

または、Object[] をパラメーターとして使用してオブジェクトをインスタンス化することもできます。

于 2013-03-22T06:17:31.857 に答える