hibernate准则api连接表问题

时间:2010-09-02 13:29:44

标签: java hibernate

我不能在连接表上使用排序。让我解释一下;

我有三张桌子。用户,角色和user_roles。 我的JPA实体是User,UserRole,UserRolePK,Role。

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

实际上我想要的输出是: “SELECT * FROM user_roles ur JOIN users u ON u.ID = ur.UserID ORDER BY u.name;”

所以我尝试使用hibernate criteria 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?

3 个答案:

答案 0 :(得分:10)

如果某个类引用其他类,则无法在“限制和订单”中简单地访问其属性。您必须为引用的对象创建别名,然后使用别名在其他对象上定义限制和订单。

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();

别名定义将创建与其他类的表的连接。只有直接映射到类表或别名的属性才能在限制或订单中使用。如果您的类包含组件,则可以直接访问它们而无需别名。

答案 1 :(得分:1)

好吧,首先我认为我们应该看到你的实体映射(Java类)

另一方面,我假设您的UserRole类具有对User实例的引用。

   @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。它总是很有用!

答案 2 :(得分:1)

在关联上使用createCriteria非常简单:

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

这将为Entites用户及其关联的Collection“角色”加入两个表。并将返回所有与自己相关联的角色称为“test”的用户。

希望有所帮助