java - 如何总结一对多关系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
)
解决方案
首先,您需要更正映射。在子实体中,您应该有父实体的引用。这意味着在“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")
长 getOrderPrice(@Param("orderId") 长 orderId);
像这样编写本机 SQL 查询
@Query("SELECT SUM(price) FROM items where order_id = :orderId", nativeQuery = true)
长 getOrderPrice(@Param("orderId") 长 orderId);
在 Java 中使用流或 for 循环,计算总价
Long sum = order.getItems.map(i->i.getprice()).stream().reduce(Long::sum).get();
推荐阅读
- urllib2 - Pytube 出错:signature = cipher.get_signature(js, stream['s']) KeyError: 's'
- google-cloud-platform - GCP 默认防火墙规则是否存在安全问题?
- architecture - 领域驱动设计中的值或实体类型的存储库
- matlab - 在 Matlab 中绘制真彩色 Sentinel-2A 图像
- oracle - 使用“with data as”子句进行更新,并且不提交正则表达式。为什么?
- regex - BBEdit 剔除过多的小数
- ios - 在 iOS 中创建菜单
- firebase - Firebase 有时会为 ios 设备获取令牌 NULL
- botframework - Bot v4 网络聊天频道,发送消息很慢
- javascript - 子组件 props 是空的,尽管它们是从父组件传递的