首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >hibernate criteria api连接表问题

hibernate criteria api连接表问题
EN

Stack Overflow用户
提问于 2010-09-02 21:29:44
回答 3查看 10.9K关注 0票数 7

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

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

代码语言:javascript
运行
复制
|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。

代码语言:javascript
运行
复制
CriteriaImpl criteria = (CriteriaImpl) session.createCriteria(UserRole.class);
criteria.addOrder(Order.asc("pk.user.name"));
List userRoles = criteria.list();

错误是无法解析: models.UserRole的属性: pk.user.name

如何在join表上使用criteria API?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-02 21:49:44

如果一个类引用了其他类,则不能简单地以限制和顺序访问它们的属性。您必须为引用的对象创建别名,然后使用该别名来定义对其他对象的限制和顺序。

代码语言:javascript
运行
复制
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();

别名定义将创建与其他类的表的联接。只有直接映射到类的表或别名的属性才能在限制或顺序中使用。如果您的类包含组件,则无需别名即可直接访问这些组件。

票数 11
EN

Stack Overflow用户

发布于 2010-09-02 21:44:40

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

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

代码语言:javascript
运行
复制
   @Entity
    @Table (name="UserRole")
    public class UserRole{

        User user;

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


    }

您应该使用createCriteria来导航association

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
List<UserRole> userRoles = getRolesWithUser();

for (UserRole role:userRoles){

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

看一看Criteria API。它总是很有帮助!

票数 1
EN

Stack Overflow用户

发布于 2010-09-02 21:48:49

只要在关联上使用createCriteria就很容易了:

代码语言:javascript
运行
复制
Criteria c=session.createCriteria(User.class)
                  .createCriteria("roles")
                  .add(Restrictions.eq("name","test")
                  .list();

这将连接Entites用户及其关联的集合“角色”的两个表。并且将返回具有与其自身相关联的角色的所有用户,该角色被称为"test“。

希望这能有所帮助

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3627550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档