如何基于父对象和子对象的属性获取一对多关联对象

问题描述 投票:0回答:1

我有一个名为“ Order”的父对象,其中有许多名为“ OrderLines”的子对象。

@Entity
@Table(name = "ORDER")
class Order {
    @Id
    @Column(name = "order_number")
    String orderId;

    @Column(name = "location_id")
    String locationId;
}

@Entity
@Table(name = "ORDER_LINES")
public class FulfilmentOrderLines {

  @ManyToOne(optional = false)
  @Id
  @JoinColumn(name = "order_number")
  private Order orderNumber;

  @Id
  @Column(name = "order_line_number", nullable = false)
  private String orderLineNumber;

  @Column(name = "status")
  private int status;
}

我必须从具有至少一个“ OrderLine”且状态低于特定值(例如1000,表示它们处于“ OPEN”状态)的特定locationId中获取所有订单。

我可以先获取一个位置的所有订单,然后根据所需的状态条件对其进行过滤。但这意味着我将必须获取该位置的所有订单,即使是已关闭的订单,也可能对性能不利。

有没有一种方法可以使用Spring Data JPA或Criteria API直接从数据库中获取所需的对象?

我正在使用SQL Server作为数据库。

java sql-server spring-boot spring-data-jpa criteria-api
1个回答
0
投票

我必须进行一些更改,但这应该适用于Spring Data JPA。首先,将密钥从FulfilmentOrderLines移到其自己的对象中以创建嵌入式ID。

@Embeddable
public class FulfilmentOrderLinesKey implements Serializable {

    @ManyToOne(optional = false)
    @JoinColumn(name = "order_number")
    private Order orderNumber;

    @Column(name = "order_line_number", nullable = false)
    private String orderLineNumber;
}

然后更新FulfilmentOrderLines以引用它。

@Entity
@Table(name = "ORDER_LINES")
public class FulfilmentOrderLines {

    @EmbeddedId
    private FulfilmentOrderLinesKey key;

    @Column(name = "status")
    private int status;
}

然后,您可以添加带有方法的存储库以返回您要查找的内容。

@Repository
public interface FulfilmentOrderLinesRepository extends JpaRepository<FulfilmentOrderLines, FulfilmentOrderLinesKey> {

    List<FulfilmentOrderLines> findAllByKeyOrderNumberLocationIdAndStatus(String locationId, int status);
}
© www.soinside.com 2019 - 2024. All rights reserved.