Спецификация Spring оставила соединение для сортировки - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть следующие сущности, и мне интересно, как я могу создать следующий запрос, используя спецификации JPA.

SELECT p.* 
   FROM   property p 
      INNER JOIN ad 
          ON ad.id = p.ad_id 
      LEFT JOIN featured_ad fad 
          ON fad.id = ad.id 
      ORDER  BY fad.start_date DESC, 
      ad.created_ts DESC 

Сущности (методы и другие свойства были удалены для упрощения классов):

public class Ad {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @ManyToOne
  private User user;
} 


public class Property implements {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @OneToOne
  @JoinColumn(unique = true)
  private Ad ad;

  @OneToOne
  @JoinColumn(unique = true)
  private Location location;
}


public class FeaturedAd {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @NotNull
  @Enumerated(EnumType.STRING)
  @Column(name = "status", nullable = false)
  private FeaturedAdStatus status;

  @Column(name = "start_date")
  private Instant startDate;

  @Column(name = "end_date")
  private Instant endDate;

  @ManyToOne
  private Ad ad;
}

Я мог бы присоединиться к свойству с надписью без проблем, но соединение с featuredAd, а затем упорядочение по его start_date - это то, что я не смог понять.

 specification = specification.and(new Specification<Property>() {
   @Override
   public Predicate toPredicate(Root<Property> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
     final Join<Ad, Property> adProperty = root.join("ad", JoinType.INNER);

      //how to join to featuredAd the order by startDate? 
      // what to return here? 
   }
 });
...