2013-02-17 65 views
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,沒有會話或會話被關閉

我的查詢或懶惰項目列表有問題嗎?

回答

0

這可能是陳舊的,但我手邊有代碼。這是我如何解決這個問題:

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); 
    CriteriaQuery<Product> criteriaQuery = criteriaBuilder.createQuery(Product.class); 
    Root<Product> queryRoot = criteriaQuery.from(Product.class); 

    Predicate idPredicate = criteriaBuilder.equal(queryRoot.get(Product_.id), id); 
    criteriaQuery.where(idPredicate); 

    TypedQuery<Product> typedQuery = em.createQuery(criteriaQuery); 

    Product theProduct = typedQuery.getSingleResult(); 

    //this triggers the lazy relationship 
    theProduct.getItemsList(); 

HTH !!!!

Federico

+0

這樣做在任何生產代碼和你的表現將會下降。你最終會有多個查詢。所以,你的解決方案的作品這是一個可怕的解決方案。使用Criteria API或Entity Graph,您可以更好地編寫自己的JPQL。 – harogaston 2017-07-07 20:18:35