порядок по полю в отфильтрованном отношении OneToMany с использованием спецификации JPA (CriteriaQuery CriteriaBuilder) - PullRequest
0 голосов
/ 06 апреля 2020

Чего я хочу добиться: упорядочить список Book сущностей в отношении @OneToMany, в указанном атрибуте c после применения условия.

@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;
}

Я хочу заказать books по book.orders.order, в котором 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")) 
    );

   ...
}
  • как мне этого добиться?
  • можно ли написать какой-нибудь нативный sql при использовании CriteriaBuilder? если да, то как мне написать причину OrderBy в моем случае с помощью natv ie sql?

1 Ответ

0 голосов
/ 07 апреля 2020

вот как мы это решили:

      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")));
...