首页 > 解决方案 > 如何总结一对多关系JPA中每个项目的成本?

问题描述

我如何计算一个订单的总和,在一对多的关系中,当客户在订单属性中购买了一定数量的商品时,他想知道,他可以开始调查,执行那个。真的有点迷茫,好想学

@Entity
@Table(name = "orders")
class Order(
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        val id: Int? = 0,

  
        val name: String? = "",
        val address: String? = "",
        val phone: String? = "",
        
        val totalOrderPrice: Long? // total based on the cost of each item


        @OneToMany(cascade = [CascadeType.MERGE])
        @JoinColumn(name = "order_id")
        val items: List<Items>? = mutableListOf()
)
@Entity
@Table(name = "items")
class Items(
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        val id: Long? = null,
        val name: String? = null,

        val price: Long?, // cost item

    )

标签: javaspringspring-bootkotlinspring-data-jpa

解决方案


首先,您需要更正映射。在子实体中,您应该有父实体的引用。这意味着在“Items”类中添加对 Order id 的引用作为列“orderId”。那么你的班级应该是这样的

@Entity
@Table(name = "items")
class Items(
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        val id: Long? = null,
        val orderId: int? = null,
        val name: String? = null,

        val price: Long?, // cost item
    )

现在,您有 3 个选项来计算订单的总价

  1. 像这样编写 JPA 查询

    @Query("SELECT SUM(m.price) FROM Items m where orderId = :orderId")

    长 getOrderPrice(@Param("orderId") 长 orderId);

  2. 像这样编写本机 SQL 查询

    @Query("SELECT SUM(price) FROM items where order_id = :orderId", nativeQuery = true)

    长 getOrderPrice(@Param("orderId") 长 orderId);

  3. 在 Java 中使用流或 for 循环,计算总价

    Long sum = order.getItems.map(i->i.getprice()).stream().reduce(Long::sum).get();


推荐阅读