如何使用criteriaBuilder和predicates查询嵌套对象

问题描述

我正在使用 spring-boot 框架做一份工作。我有三张桌子:

支付交易
订购
订单项

这些类定义了 3 个表,如下所示:

@Entity
@Table(name = "payment_transaction")
@EqualsAndHashCode(callSuper = true)
@Data
public class PaymentTransaction extends BaseEntity {

    /**
     *
     */
    private static final long serialVersionUID = 6551819616644943167L;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "order_id")
    private Order order;

    @Column(name = "amount")
    private BigDecimal amount;

@Entity
@Table(name = "`order`")
@EqualsAndHashCode(callSuper = true)
@Getter
@Setter
public class Order extends BaseEntity {

    /**
     *
     */
    public static final long serialVersionUID = 1280823802207154940L;

    @Column(name = "status")
    @Enumerated(value = EnumType.STRING)
    public OrderStatus status;

    @JsonManagedReference
    @OnetoMany(mappedBy = "order")
    public List<OrderItem> orderItems;
@Entity
@Table(name = "order_item")
@EqualsAndHashCode(callSuper = true)
@Getter
@Setter
public class OrderItem extends BaseEntity {

    /**
     *
     */
    public static final long serialVersionUID = 8153719163599603427L;

    @JsonBackReference
    @ManyToOne
    @JoinColumn(name = "order_id")
    public Order order;

    @Column(name = "status")
    @Enumerated(value = EnumType.STRING)
    public OrderStatus status;

我需要用代码查询这些 PaymentTransation 是 OrderItem === "COMPLETED" 的属性值,通过重写方法public Predicate toPredicate(Root<PaymentTransaction> root,CriteriaQuery<?> query,CriteriaBuilder criteriaBuilder){};
我的问题是 OrderItem 嵌套在 Order 中,Order 嵌套在 PaymentTransaction 中,Order 包含一个 OrderItem 列表。这些查询对我来说太难了。
在被覆盖的方法中,我看到许多简单的查询,例如:


if (sellerId != null) {
  Predicate preSeller = criteriaBuilder.equal(root.get("sellerId"),sellerId);
  predicates.add(criteriaBuilder.and(preSeller));
}

if (buyerId != null) {
  Predicate preBuyer = criteriaBuilder.equal(root.get("buyerId"),buyerId);
  predicates.add(criteriaBuilder.and(preBuyer));
}
  

谁能帮我解决这个问题????

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)