2012-07-05 94 views
2

在我的應用程序有哪些有權限的角色,我曾經這樣做:JPA 2個標準與Hibernate查詢失敗左連接

Query query = 
     em.createQuery(
      "SELECT distinct r FROM Role r left join fetch r.permissions " 
      + "where r.domain = ? " + "order by r.createdOn ").setParameter(
      1, domain); 

    return query.getResultList(); 

,但希望在偷懶初始化更好的控制。所以我正在嘗試這個,但它不起作用,因爲連接正在執行,就好像它是內部連接一樣,沒有帶來一個角色及其權限,而是每行和每個權限都帶來一個結果。

public List<Role> findAll() 
{ 
    CriteriaBuilder criteriaBuilder; 
    CriteriaQuery<Role> criteriaQuery; 
    Root<Role> queryRoot; 
    Order createdOnDesc; 
    TypedQuery<Role> typedQuery; 
    List<Role> roleResultList; 

    //initialize query system 
    criteriaBuilder = em.getCriteriaBuilder(); 

    //select * from Role 
    criteriaQuery = criteriaBuilder.createQuery(Role.class); 
    queryRoot = criteriaQuery.from(Role.class); 

    //join permissions by default "LEFT" 
    //***THIS LINE IS FAILING*** ???? 
    queryRoot.join(Role_.permissions); 

    //get query 
    typedQuery = em.createQuery(criteriaQuery); 

    //the steps below must be done to avoid lazy initialization exceptions 
    //in case we want to access the list at a later time 
    roleResultList = typedQuery.getResultList(); 

    for (Role role : roleResultList) 
    { 
     role.getPermissionsList(); 
    } 

    return roleResultList; 
} 

任何想法或想法將不勝感激。

回答

1

這對我來說有點不清楚,你想達到什麼目的,但無論如何也許會有幫助。

這是默認的內部連接,正如API中所述。

//join permissions by default "LEFT" 
//***THIS LINE IS FAILING*** ???? 
queryRoot.join(Role_.permissions); 

如果需要類似於原來的JPQL查詢的東西,可以用fetch完成。

queryRoot.join(Role_.permissions, JoinType.LEFT); 

當需要不同的結果,那麼CriteriaQuery.distinct是有用的:如果你想使用左(外)加入代替,可以與join方法,它JoinType作爲參數來完成。

+0

這對我來說有點不清楚,我刪除了「加入」行,所有工作都很好!謝謝! – fedevela 2012-08-14 16:42:44