【问题标题】:How to fetch one-to-many associated objects based on properties of both parent and child objects如何根据父对象和子对象的属性获取一对多关联对象
【发布时间】:2020-09-11 01:43:37
【问题描述】:

我有一个名为“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;
}

我必须从特定 locationId 获取所有订单,该 locationId 至少有一个“OrderLine”,其状态低于某个值(比如 1000,表示这些订单处于“OPEN”状态)。

我可以先获取某个位置的所有订单,然后根据所需的状态标准对其进行过滤。但这意味着我必须获取该位置的所有订单,甚至是已关闭的订单,这可能对性能不利。

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

我使用 SQL Server 作为数据库。

【问题讨论】:

  • 为什么不创建一个包含所需信息的 ORDER_DATAILS 表并对其进行映射。
  • 您是在谈论创建另一个表吗?当这肯定是多对一关系时,我们为什么要这样做?

标签: java sql-server spring-boot spring-data-jpa criteria-api


【解决方案1】:

我必须进行一些更改,但这应该适用于 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    相关资源
    最近更新 更多