2010-09-02 166 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