【问题标题】:JPA Criteria select from some tables从一些表中选择 JPA 标准
【发布时间】:2016-05-31 06:24:07
【问题描述】:

表的结构如下:

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());

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

线程“主”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) 来自 srt.entity.ScheduleEntity as generatedAlias0 内连接 generateAlias0.idTrain 作为 generateAlias1 内连接 generatedAlias0.idStation 为 generatedAlias2]

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

【问题讨论】:

    标签: java mysql hibernate jpa criteria


    【解决方案1】:

    我在 JPA 标准的概念上是错误的。现在我完全明白了,答案如下:

    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());
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-04
      • 1970-01-01
      • 1970-01-01
      • 2016-01-25
      • 2023-03-31
      • 1970-01-01
      • 2014-11-27
      • 1970-01-01
      相关资源
      最近更新 更多