如何按其在 Broadleaf Commerce 上的类别对购物车中的 OrderItems 进行排序?

How to sort the OrderItems in the cart by its category on Broadleaf Commerce?

Broadleaf Commerce 网站

我需要按产品类别对购物车中的 OrderItems 进行排序。目前,我正在使用比较器对 OrderItems 进行排序。

自定义购物车订单项默认排序的最佳或正确方法是什么?

我假设您目前正在做这样的事情:

List<OrderItem> items = cart.getOrderItems();
Collections.sort(items, comparator);

我还假设 "default sort" 你的意思是你想在调用 cart.getOrderItems() 时改变行为。

遗憾的是,无法更改调用 getOrderItems() 时发生的查询行为,因为这是对 OrderImpl 中的 OrderItem 集合的 JPA 生成查询:

@OneToMany(mappedBy = "order", targetEntity = OrderItemImpl.class, cascade = {CascadeType.ALL})
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE, region="blOrderElements")
@AdminPresentationCollection(friendlyName="OrderImpl_Order_Items",
        tab = TabName.General)
protected List<OrderItem> orderItems = new ArrayList<>();

因此,您实际上只有 3 个选择:

  1. 覆盖 OrderImpl class 并更改 getOrderItems() 方法的实现。除非你真的 需要 扩展它(比如向 BLC_ORDER 添加另一列),否则这不是一个很好的解决方案,因为它会向 table 添加另一个实际未使用的数据库。参见Broadleaf extending entities tutorial。您还可以通过切换到单 table 继承在技术上避免多 table 继承,这在该文档的底部有详细说明

  2. 在使用 JPA 查询

  3. 手动查询 OrderItem 订单的服务方法中的某处添加您自己的查询
  4. 做您当前正在做的事情,并在使用比较器检索后手动对订单项目进行排序。您可能会考虑添加一个 Thymeleaf 实用程序方法,以便在您的模板中使用它