- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试映射以下实体:
我有一个包含不同类型的 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 的所有 Order 实体。有没有办法实现这个目标?
到目前为止,我的 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();
}
最佳答案
<强>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;
}
}
关于java - 使用 JPA 和 Criteria API 连接泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19854013/
我是一名优秀的程序员,十分优秀!