【问题标题】:EclipseLink- JPQL join tables through queryEclipseLink-JPQL 通过查询连接表
【发布时间】:2019-01-26 05:23:19
【问题描述】:

我的 JPQl 有问题。这是与 TrainRoute 和 TrainRouteStation 的一对多关系。我正在尝试创建内部联接并获取数据。当我使用 mysql workbeanch 并尝试将其转换为 JPQL 时,本机 SQL 查询工作。另外,我试图从 2 天开始修复。

错误:对象比较只能与 OneToOneMappings 一起使用。其他映射比较必须通过查询键或直接属性级别比较来完成。

类:火车路线

    @Basic(optional = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id    
    @Column(name = "train_route_id", unique = true, nullable = false)
    public Long getTrainRouteId() {
        return this.trainRouteId;
    }

    public void setTrainRouteId(Long trainRouteId) {
        this.trainRouteId = trainRouteId;
    }

    @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER, mappedBy = "trainRoute")
    public List<TrainRouteStationData> getTrainRouteStations() {
        return this.trainRouteStations;
    }

    public void setTrainRouteStations(List<TrainRouteStationData> trainRouteStations) {
        this.trainRouteStations = trainRouteStations;
    }

类:火车路线站

    @Basic(optional = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id    
    @Column(name = "train_route_station_id", unique = true, nullable = false)
    public Long getTrainRouteStationId() {
        return this.trainRouteStationId;
    }

    public void setTrainRouteStationId(Long trainRouteStationId) {
        this.trainRouteStationId = trainRouteStationId;
    }

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "train_route_id", nullable = false)
    public TrainRouteData getTrainRoute() {
        return this.trainRoute;
    }

JPQL :"SELECT s FROM TrainRouteData t inner join TrainRouteStationData s ON t.trainRouteId=s.trainRoute where s.stationSeqN &gt;=1 AND s.stationSeqN &lt;=3 AND t.trainRouteDescX='Test1-Test2' order by s.stationSeqN asc"

原生 SQL:SELECT train_route_station.* FROM train_route inner join train_route_station ON train_route.train_route_id=train_route_station.train_route_id where train_route_station.station_seq_n &gt;= 1 AND train_route_station.station_seq_n &lt;= 3 AND train_route.train_route_desc_x='Test1-Test2' order by train_route_station.station_seq_n asc

它会抛出一个错误: 异常描述:对象比较只能与 OneToOneMappings 一起使用。其他映射比较必须通过查询键或直接属性级别比较来完成。 映射:[org.eclipse.persistence.mappings.DirectToFieldMapping[trainRouteId-->train_route.train_route_id]] 表达: [ 查询key trainRouteId

如何更改该查询?

【问题讨论】:

    标签: sql eclipselink jpql


    【解决方案1】:

    这不是 JPQL 中连接的工作方式。

    正确的查询是

    select s from TrainRouteData t inner join t.trainRouteStations s 
    where s.stationSeqN >= 1 
    and s.stationSeqN <= 3 
    and t.trainRouteDescX = 'Test1-Test2' 
    order by s.stationSeqN asc
    

    【讨论】:

    • 嗨@JBNizet 非常感谢您的指导。它正在工作:)
    • SELECT s FROM TrainRouteData t inner join TrainRouteStationData s ON t.trainRouteId=s.trainRoute.train_route_id where s.stationSeqN >= (SELECT s1.stationSeqN FROM TrainRouteData r1 inner join TrainRouteStationData s1 ON r1.trainRouteId= s1.trainRoute.train_route_id where r1.trainRouteDescX='Test1-Test2' and s1.stationC='ALNPP') AND s.stationSeqN
    • 以上查询是我实际的 JPQL,它也包含二级内部连接。你能指导我创建正确的吗?
    • 您正在犯与我已经修复的完全相同的错误。现在是您真正阅读我的答案并学习 JPQL 的时候了。我不会写你所有的代码。
    • 将完整的 Native sql 转换为 JPQl。谢谢。
    猜你喜欢
    • 2012-11-17
    • 1970-01-01
    • 2020-10-05
    • 2018-07-06
    • 2014-02-21
    • 1970-01-01
    • 2020-03-26
    • 2019-07-22
    • 1970-01-01
    相关资源
    最近更新 更多