我正在尝试映射以下实体:
我有一个包含不同类型 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();
}