[英]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.