如何总结一对多关系JPA中每个项目的成本?

Posted

技术标签:

【中文标题】如何总结一对多关系JPA中每个项目的成本?【英文标题】:How to sum the cost of each item in a One To Many relationship JPA? 【发布时间】:2020-11-26 05:52:38 【问题描述】:

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

@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

    )

【问题讨论】:

检查这是否是您的solution。 【参考方案1】:

首先,您需要更正映射。在子实体中,您应该有父实体的引用。这意味着在“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 个选项来计算订单的总价

    像这样编写 JPA 查询

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

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

    像这样编写 Native SQL 查询

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

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

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

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

【讨论】:

非常感谢您的帮助!你太棒了 很高兴知道它对你有帮助

以上是关于如何总结一对多关系JPA中每个项目的成本?的主要内容,如果未能解决你的问题,请参考以下文章

使用具有一对多关系的 JPA 映射实体,如何添加连接条件

JPA 2 一对多 - JPA 如何推断列信息?

JPA中实现单向一对多的关联关系

JPA的一对多,多对多用法

Jpa配置一对多关系

JPA - 使用 EclipseLink 保持单向一对多关系失败