【问题标题】:JPA Criteria API query with Join and inheritance具有联接和继承的 JPA 标准 API 查询
【发布时间】:2014-05-08 23:25:45
【问题描述】:

我正在尝试使用 JPA Criteria API 编写查询。我有以下课程:

Class Booking {

  @ForeignKey(name = "BVisit_ID_FK")
  private List<BVisit> BVisits = new LinkedList<>();

    //other properties
    ...
}

Class Visit{

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "ID")
  private Long id;

}

Class VisitSpecial extends Visit{

  @Column(name = "ARRIVAL_TIME", nullable = false)
  private Date arrivalTime;

  @Column(name = "DEPARTURE_TIME", nullable = false)
  private Date departureTime;

  //other properties...
}`

如何使用 JPA Criteria Api(和元模型)编写查询,以查找所有具有 访问的日期值(参数)介于最小到达时间和预订访问的最大出发时间之间。 我使用 org.springframework.data.jpa.domain.Specification

查询应该如下所示:

SELECT Booking 
from Booking B, Visit V, VisitSpecial VS
where Visit.bookingId = Booking.id and Visit.id = VisitSpecial.id
      and VisitSpecial.arrivalTime = (SELECT MIN(VisitSpecial.arrivalTime) from VisitSpecial VS1 WHERE V.id = VS1.id)
      and VisitSpecial.arrivalTime <= :date
      and VisitSpecial.departureTime = (SELECT MAX(VisitSpecial.departureTime) from VisitSpecial VS1 Where V.id = VS1.id)
      and VisitSpecial.departureTime >= :date

【问题讨论】:

    标签: spring jpa jpa-2.0 criteria-api


    【解决方案1】:

    通过JPA Criteria Subquery 处理InheritanceType.JOINED 和其他继承策略,请参阅我的回答here

    使用treat 向下转换可能有效,但我不建议将其用于复杂查询,因为它可能会产生低效查询(冗余连接)或根据您的 JPA 提供程序(Hibernate、Eclipselink 等)根本不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      • 2015-03-06
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 2016-05-23
      相关资源
      最近更新 更多