使用 JPA 查找订单的总价

Find total price for an order using JPA

我有一个带有实体图的 JPA 应用程序,它显示了订单和客户之间的关系。

我有一个 ItemType 实体 class 这样的:

@Entity
public class ItemType implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private String description;
private int price;
List<OrderLine> orderlines;

class 包含订单行列表,因为它与订单行实体具有一对多关系。

这是我的 OrderLine 实体。由于关系,它包含 ItemType class 的单个实例。

@Entity
public class OrderLine implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private int quantity;
private Order order;
private ItemType itemtype;

我有一个门面 class,我在其中使用了不同的方法来计算和 select 来自我的数据库的元素,但我想制作一个 calculatePrice 方法,它将来自带有 ItemType 价格的订单行。

我知道函数需要同时采用 ItemType 实例和 OrderLine 实例,如下所示:

 public int getTotalPrice(ItemType itemtype, OrderLine orderline){


}

但我不确定是否应该在实体 classes 中使用 NamedQueries 从数据库中获取数据,或者我应该使用可以进行计算的值注释之类的东西。

两个选项都有效,各有优缺点。

如果将其定义为Query,您将获得更少的java代码。查询将绑定到您的实体,以一种不那么冗长的方式。

不利的一面是您将无法利用休眠会话提供的 1 级缓存。缓存结果的唯一方法是通过二级查询缓存(如果您配置了它),但这种类型的缓存仍然不是很好。

如果您决定使用 java,您将充分利用 Hibernate Session 及其功能。您将可以很好地控制查询执行的频率和频率。您将能够调试 Java 代码。您将能够对其进行单元测试。

您的选择摘要:

  1. 使用查询,从您的服务调用它。
  2. 使用公式,这样您就不需要调用您的查询,而是在您加载实体后对您的公式进行评估。
  3. 执行遍历树并计算值的 java 方法。在缓存密集型应用程序中,这是性能最高的方法,而且单元测试也很容易。