0
我有以下設置標準API加入延遲集合
@Entity
@Table(name = "Product")
public class Product implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String name;
@OneToMany(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
private final List<Item> itemlist = new ArrayList<Item>();
//some other attributes, getter/setter
}
@Entity
@Table(name = "Item")
public class Item implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private Date startDate;
//some other attributes, getter/setter
}
beween這些類的連接僅僅是單向的。如果雙向連接更好(例如性能方面)?
如何查詢在日期(startDate)之後啓動並指定了特定產品的所有項目?
我嘗試使用標準的API實現這一點:
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Item> criteriaQuery = criteriaBuilder.createQuery(Item.class);
criteriaQuery = criteriaQuery.distinct(true);
Metamodel m = em.getMetamodel();
EntityType<Product> Product_ = m.entity(Product.class);
Root<Product> root = criteriaQuery.from(Product_);
Join join = root.join("itemlist");
Predicate condition = criteriaBuilder.equal(join.get("product"), selectedProduct);
criteriaQuery.where(condition);
criteriaQuery.select(join);
TypedQuery<Item> tq = em.createQuery(criteriaQuery);
System.out.println("result " + tq.getResultList());
我得到異常:
org.hibernate.LazyInitializationException:無法初始化懶洋洋角色的集合:com.test.Product。 itemlist,沒有會話或會話被關閉
我的查詢或懶惰項目列表有問題嗎?
這樣做在任何生產代碼和你的表現將會下降。你最終會有多個查詢。所以,你的解決方案的作品這是一個可怕的解決方案。使用Criteria API或Entity Graph,您可以更好地編寫自己的JPQL。 – harogaston 2017-07-07 20:18:35