2010-09-02 91 views
6

我無法對連接表進行排序。讓我解釋;休眠條件api連接表問題

我有三個表。用戶,角色和user_roles。 我的JPA實體是User,UserRole,UserRolePK,Role。

|User |  | UserRole |  | UserRolePK |  | Role | 
|--------|  |----------|  --------------  -------- 
|id  |  | pk  |  | user  |  | id | 
|name |      | role  |  | name | 

其實我想要的輸出是: 「SELECT * FROM user_roles烏爾用戶加入U ON u.ID = ur.UserID ORDER BY u.name;」

因此我嘗試使用hibernate標準API。

CriteriaImpl criteria = (CriteriaImpl) session.createCriteria(UserRole.class); 
criteria.addOrder(Order.asc("pk.user.name")); 
List userRoles = criteria.list(); 

的錯誤是 無法解析屬性:的pk.user.name:models.UserRole

如何使用標準API的連接的表?

回答

9

如果一個類引用其他類,你不能簡單地訪問他們的限制和訂單屬性。您必須爲引用的對象創建別名,然後使用別名來定義其他對象上的限制和訂單。

Criteria criteria = (CriteriaImpl) session.createCriteria(UserRole.class); 
criteria.createAlias("pk", "a1"); 
criteria.createAlias("a1.user", "a2"); 
criteria.addOrder(Order.asc("a2.name")); 
List userRoles = criteria.list(); 

別名定義將創建與其他類的表的聯接。只有直接映射到類表或別名的屬性才能用於限制或訂單。如果你的類包含組件,他們可以直接訪問而不用別名。

+0

看起來不錯,但它不起作用。 未知列'a2x2_。名稱'in'訂單子句' 並且這是由標準API生成的sql查詢。 __「選擇this_.RoleID作爲RoleID614_0_,this_.UserID作爲UserID614_0_ from user_roles this_ order by a2x2_.Name asc」__ – 2010-09-03 05:50:03

+0

也許映射有問題。如果屬性是多對一關係,則創建別名通常應該加入表。您的表格圖形不包含任何關係。也許你應該添加它們或將映射添加到問題中。 – Reboot 2010-09-03 07:13:28

1

好吧,首先,我認爲我們應該看到您的實體映射(Java類)

在另一方面,我會假設你的UserRole類有一個用戶實例的引用。

@Entity 
    @Table (name="UserRole") 
    public class UserRole{ 

     User user; 

     @OneToMany //correct mapping here 
     public User getUser(){return this.user;} 


    } 

您應該使用createCriteria導航association

public List<UserRole> getRolesWithUser(){ 
    Criteria userRoleCriteria = session.createCriteria(UserRole.class); 
    userRoleCriteria.createCriteria("user"); //joins the table. 
    userRoleCriteria.addOrder("user.name"); //adds order 

    return criteria.list(); 
} 

這裏的問題是,它會帶來UserRole實例,但您可以導航到User

List<UserRole> userRoles = getRolesWithUser(); 

for (UserRole role:userRoles){ 

    User user = role.getUser(); 
    //do something with role , user 
} 

看看Criteria API。它總是有幫助的!

+0

在user_roles表中,UserID和RoleID列是主鍵。所以我使用嵌入式密鑰和其他類(UserRolePK).UserRolePK具有正確的映射。 – 2010-09-03 05:54:19

1

很容易只使用個createCriteria上的關聯:

Criteria c=session.createCriteria(User.class) 
        .createCriteria("roles") 
        .add(Restrictions.eq("name","test") 
        .list(); 

這將加入兩個表的用戶的entites及其關聯集「角色」。並且將返回所有具有與他們自己相關聯的角色的用戶,稱爲「測試」。

希望幫助

+0

在用戶實體中沒有像角色那樣的多對多關係屬性。相反,我使用了UserRole實體。 – 2010-09-03 05:43:39