简体   繁体   English

如何使用JPQL联接同一表

[英]How to join same table with JPQL

I have a table in my database, which contains sportsresults, and I need to select the last result for a competitor on a specific eventstage from a table. 我的数据库中有一个表,其中包含运动结果,我需要从表中为特定事件阶段的竞争对手选择最后的结果。

I have this table: 我有这张桌子:

+----------------+---------------+------+-----+---------+-------+
| Field          | Type          | Null | Key | Default | Extra |
+----------------+---------------+------+-----+---------+-------+
| EventStageID   | int(11)       | NO   | PRI | NULL    |       |
| CompetitorID   | int(11)       | NO   | PRI | NULL    |       |
| Lap            | int(11)       | NO   | PRI | NULL    |       |
| Time           | varchar(255)  | YES  |     | NULL    |       |
| Status         | varchar(255)  | YES  |     | NULL    |       |
| PitstopCount   | int(11)       | YES  |     | NULL    |       |
| Grid           | int(11)       | YES  |     | NULL    |       |
| FastestLapTime | varchar(255)  | YES  |     | NULL    |       |
| Substatus      | varchar(255)  | YES  |     | NULL    |       |
| Points         | decimal(10,2) | YES  |     | NULL    |       |
| Position       | int(11)       | YES  |     | NULL    |       |
| StageType      | int(11)       | YES  |     | NULL    |       |
+----------------+---------------+------+-----+---------+-------+

I can select from the table with normal SQL query like this: 我可以从具有常规SQL查询的表中进行选择,如下所示:

SELECT * FROM 
  (SELECT EventStageID as esi, CompetitorID as cid, Max(Lap) as MaxLap FROM srt_outright_season_event_stage_result_live WHERE EventStageID = 191666 GROUP BY CompetitorID) as y 
LEFT JOIN 
  (SELECT * FROM srt_outright_season_event_stage_result_live) as x 
ON x.CompetitorID = y.cid AND x.Lap = y.MaxLap AND x.EventStageID = y.esi;

Which gives the following result: 得到以下结果:

+--------+--------+--------+--------------+--------------+------+----------+--------+--------------+------+----------------+-----------+--------+----------+-----------+
| esi    | cid    | MaxLap | EventStageID | CompetitorID | Lap  | Time     | Status | PitstopCount | Grid | FastestLapTime | Substatus | Points | Position | StageType |
+--------+--------+--------+--------------+--------------+------+----------+--------+--------------+------+----------------+-----------+--------+----------+-----------+
| 191666 |   4521 |      0 |       191666 |         4521 |    0 | Finished | NULL   |         NULL | NULL | 2:00.175       | NULL      |   NULL |        4 |         5 |
| 191666 |   4524 |      0 |       191666 |         4524 |    0 | Finished | NULL   |         NULL | NULL | 2:04.053       | NULL      |   NULL |       10 |         5 |
| 191666 |   4533 |      0 |       191666 |         4533 |    0 | Finished | NULL   |         NULL | NULL | NULL           | NULL      |   NULL |       13 |         5 |
| 191666 |   4538 |      0 |       191666 |         4538 |    0 | Finished | NULL   |         NULL | NULL | 2:01.218       | NULL      |   NULL |        6 |         5 |
| 191666 |   5769 |      0 |       191666 |         5769 |    0 | Finished | NULL   |         NULL | NULL | 2:00.050       | NULL      |   NULL |        3 |         5 |
| 191666 |   7135 |      0 |       191666 |         7135 |    0 | Finished | NULL   |         NULL | NULL | 1:59.431       | NULL      |   NULL |        1 |         5 |
| 191666 |   7138 |      0 |       191666 |         7138 |    0 | Finished | NULL   |         NULL | NULL | NULL           | NULL      |   NULL |       18 |         5 |
| 191666 |   7610 |      0 |       191666 |         7610 |    0 | Finished | NULL   |         NULL | NULL | 1:59.486       | NULL      |   NULL |        2 |         5 |
+--------+--------+--------+--------------+--------------+------+----------+--------+--------------+------+----------------+-----------+--------+----------+-----------+

I have this Entity class: 我有这个Entity类:

@Entity(name = "event_stage_result_live")
public class EventStageResultLive {

    @EmbeddedId
    private PKEventStageResultLive pkEventStageResultLive;
    // Composite PK contains EventStageID, CompetitorID and Lap

    @Column(name = "Time")
    private String time;

    @Column(name = "Status")
    private String status;

    @Column(name = "PitstopCount")
    private Integer pitstopCount;

    @Column(name = "Grid")
    private Integer grid;

    @Column(name = "Position")
    private Integer position;

    @Column(name = "FastestLapTime")
    private String fastestLapTime;

    @Column(name = "Substatus")
    private String substatus;

    @Column(name = "Points")
    private Float points;

    @Column(name = "StageType")
    private StageType stageType;

    // getters and setters...
}

I think in SQL you can do something like this. 我认为在SQL中,您可以执行以下操作。 I dont think join is required. 我不认为需要加入。

select * from srt_outright_season_event_stage_result_live c
    where c.CompetitorID = :competitorID and c.EventStageID = 191666 
        and c.Lap =  (select max(d.lap) from  srt_outright_season_event_stage_result_live d
                where d.CompetitorID = :competitorID and d.EventStageID = 191666 )

Passed to JPQL is 传递给JPQL的是

select e from EventStageResultLive e
    where e.pkEventStageResultLive.CompetitorID = :competitorID and c.pkEventStageResultLive.EventStageID = 191666 
        and e.pkEventStageResultLive.Lap =  (select max(d.pkEventStageResultLive.lap) from  EventStageResultLive d
                where d.pkEventStageResultLive.CompetitorID = :competitorID and d.pkEventStageResultLive.EventStageID = 191666 )

Assuming 假设

public class PKEventStageResultLive{
  private int CompetitorID ;
  private int EventStageID ;
  private int Lap;
}

If the name of the properties are different correct the name in the JPQL 如果属性名称不同,请更正JPQL中的名称

And competitorID as a named parameter. 并将competitorID作为命名参数。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM