1

我正在尝试映射以下实体:

我有一个包含不同类型 OrderData 的 Order 实体(也可以在多个 Order 实体之间共享),具体取决于实际订单(不同的产品、产品变体等):

//Simplified example
@Entity
@IdClass(OrderPK.class)
@Table(name = "tablename"
public class Order<T extends OrderData> {
    @Id
    @ManyToOne
    @JoinColumn(name = "whatever")
    private T orderData;

    // Might be complicating stuff
    @Id
    @ManyToOne 
    @JoinColumn(name = "somecolumn")
    private Account buyerAccount;
    // ...
}

// OrderData base class
@Entity
@Table(name = "thatothertable"
@Inheritance(strategy=InheritanceType.JOINED)
public class OrderData {
    @Id
    @Column(name = "id")
    private Long id;

    // extra stuff
}

现在的问题是:我怎样才能让它加入 OrderData 的正确子类?我希望能够编写如下内容: List<Order<CustomOrderData>> ordersWithCustomOrderData = this.orderDAO.findAllOrders(); 并使用 CustomOrderDatas 获取所有订单实体。有没有办法做到这一点?

到目前为止,我的 DAO 代码如下所示:

public List<Order> findAllOrders() {
    CriteriaBuilder cb = this.em.getCriteriaBuilder();
    CriteriaQuery<Order> cq = cb.createQuery(Order.class);
    Root<Order> root = cq.from(Order.class):
    cq.select(root):
    return this.em.createQuery(cq).getResultList();
}

我将如何更改 DAO 代码以支持泛型类型?真的有可能吗?如果没有,是否有任何替代设计来实现可比较的结构和功能(具有不同 OrderData 的订单,能够搜索具有特定 OrderData 子类的订单)?

// Not working pseudo code of what i want
public <T extends OrderData> List<Order<T>> findAllOrders() {
    CriteriaBuilder cb = this.em.getCriteriaBuilder();
    // With createQuery(Order.class) i will get CrtieriaQuery<Order>
    CriteriaQuery<Order<T>> cq = cb.createQuery(Order.class);
    // as above
    Root<Order<T>> root = cq.from(Order.class):
    cq.select(root):
    return this.em.createQuery(cq).getResultList();
}
4

1 回答 1

0

1. 想法

为什么需要通用属性?通用实体在 JPA 中是不可能的,但您可以将对 Orderdata 的引用设置为:

private OrderData orderData;

2.想法

您可以将此枚举保存在您的实体中,然后与您的进行比较OrderDataType.getClazz()OrderData1.getClass()您可以查询此类型。如果您使用的是 JPA 2.1,您可以使用自定义 Fieldconverter 将完整的类名保存在数据库列中,然后查询该类。

public enum OrderDataType {
    Order1(Order1.class);

    private Class<? extends OrderData> clazz;

    private OrderDataType(Clazz<? extends OrderData> clazz) {
        this.clazz = clazz;
    }

    public Class<? extends OrderData> getClazz() {
        return clazz;
    }
}
于 2013-11-08T08:16:10.010 回答