JPA Criteria从一些表中选择

时间:2016-02-18 21:08:37

标签: java mysql hibernate jpa criteria

表格的结构如下:

CREATE TABLE Train
(
    idTrain INT NOT NULL AUTO_INCREMENT,
    nameTrain CHAR(20) NOT NULL,
    PRIMARY KEY (idTrain)
);

CREATE TABLE Station
(
    idStation INT NOT NULL AUTO_INCREMENT,
    nameStation CHAR(50) NOT NULL,
    PRIMARY KEY (idStation)
);

CREATE TABLE Schedule
(
    idStation INT NOT NULL,
    idTrain INT NOT NULL,
    arrivalTime TIME NOT NULL,
    departureTime TIME NOT NULL,
    nextStation INT NOT NULL,
    kmToNextStation INT NOT NULL,
    PRIMARY KEY (idStation, idTrain, nextStation),
    FOREIGN KEY (idStation) REFERENCES Station(idStation),
    FOREIGN KEY (idTrain) REFERENCES Train(idTrain),
    FOREIGN KEY (nextStation) REFERENCES Station(idStation)
);

使用JPA Criteria实现以下sql-query是必要的:

SELECT Station.nameStation, Schedule.arrivalTime, Schedule.departureTime, Schedule.kmToNextStation
FROM Schedule
JOIN Station
    ON Station.idStation = Schedule.idStation
JOIN Train
    ON Schedule.idTrain = Train.idTrain
WHERE Train.nameTrain = "268A";

这是我的尝试:

EntityManager em = EntitySupport.getEntityManager();
        CriteriaBuilder builder = em.getCriteriaBuilder();
        CriteriaQuery<ScheduleEntity> cq = builder.createQuery(ScheduleEntity.class);
        Root<ScheduleEntity> root = cq.from(ScheduleEntity.class);
        Join<ScheduleEntity, TrainEntity> idTrain = root.join("idTrain");
        Join<ScheduleEntity, StationEntity> idStation = root.join("idStation");
        cq.multiselect(root.get("arrivalTime"),
                root.get("departureTime"),
                idTrain.get("nameTrain"));
        Query query = em.createQuery(cq);
        List res = query.getResultList();
        System.out.println("Result query: " + res.toString());

显然,我做错了,因为我收到以下错误:

  

线程“main”中的异常java.lang.IllegalArgumentException:   org.hibernate.hql.internal.ast.QuerySyntaxException:无法找到   类[srt.entity.ScheduleEntity]上的适当构造函数。预期   参数是:java.util.Date,java.util.Date,java.lang.String   [选择新的srt.entity.ScheduleEntity(generatedAlias0.arrivalTime,   generatedAlias0.departureTime,generatedAlias1.nameTrain)from   srt.entity.ScheduleEntity as generatedAlias0内部联接   generatedAlias0.idTrain as generatedAlias1 inner join   generatedAlias0.idStation as generatedAlias2]

帮助我使用JPA Criteria为上述sql-query创建正确的代码。

1 个答案:

答案 0 :(得分:0)

我在JPA Criteria的概念中错了。现在我完全理解,答案如下:

EntityManager em = EntitySupport.getEntityManager();
        CriteriaBuilder builder = em.getCriteriaBuilder();
        CriteriaQuery<ScheduleEntity> cq = builder.createQuery(ScheduleEntity.class);
        Root<ScheduleEntity> from = cq.from(ScheduleEntity.class);
        Join<ScheduleEntity, StationEntity> idStation = from.join("idStation");
        Join<ScheduleEntity, TrainEntity> idTrain = from.join("idTrain");
        Predicate where = builder.equal(idTrain.get("nameTrain"), "268A");
        cq.where(where);
        List<ScheduleEntity> schedule = em.createQuery(cq).getResultList();
        for(ScheduleEntity s : schedule) {
            System.out.println(s.toString());
        }