gpt4 book ai didi

java - 使用 JPA 和 Criteria API 连接泛型类型

转载 作者:行者123 更新时间:2023-12-01 04:11:49 24 4
gpt4 key购买 nike

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

我有一个包含不同类型的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com