繁体   English   中英

使用 JPA 规范(CriteriaQuery CriteriaBuilder)按过滤后的 OneToMany 关系中的字段排序

[英]order by a field in a filtered OneToMany relation using JPA Specification ( CriteriaQuery CriteriaBuilder )

我想要实现的目标:在应用条件后在特定属性上的 @OneToMany 关系上订购Book实体列表。

@Entity
public class Book{

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

  @OneToMany(mappedBy = "entity", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
      Set<RowOrder> orders;
}

@Entity
public class RowOrder {

  @EmbeddedId
  private RowOrderId id;

  @ManyToOne
  @MapsId("entityId")
  @JoinColumn(name = "entity_id")
  private Book entity; 

  @ManyToOne
  @MapsId("userId")
  @JoinColumn(name = "user_id")
  private User user;

  @Column(name = "entity_order")
  private Long order;
}
@Entity
public class User {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "userId")
  private Long id;
}

我想按book.orders.order订购books ,其中order.userId == aUser.id

我正在使用jpa.domain.Specification过滤我想在其中应用此订单的位置。



@AllArgsConstructor
public class BookSpecification implements Specification<Book> {

  ...

  @Override
  public Predicate toPredicate(Root<Task> root, CriteriaQuery<?> criteriaQuery,
      CriteriaBuilder criteriaBuilder) {

 ...

aUser ; // this the user entity in which i want to apply on the relation

 criteriaQuery.orderBy(criteriaBuilder.asc(
        root.join("orders", JoinType.LEFT) // <--- how to filter this with, WHERE row_order.user_id = aUser.id
            .get("order")) 
    );

   ...
}
  • 我怎样才能做到这一点?
  • 我可以在使用CriteriaBuilder时编写一些本机 sql 吗? 如果是这样,我如何使用 natvie sql 编写 OrderBy 原因?

这就是我们解决它的方法:

      Join<Book, RowOrder> books_orders_join = root.join("orders", JoinType.LEFT);
      Join<Join<Book, RowOrder>, User> books_orders_users_join = books_orders_join
          .join("user", JoinType.LEFT);

      predicates
          .add(
              criteriaBuilder
                  .equal(books_orders_users_join.get("id"), aUser.getId()));

      criteriaQuery.orderBy(criteriaBuilder.asc(books_orders_join.get("order")));

暂无
暂无

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

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