Hibernate Criteria - 多对多关系

Posted

技术标签:

【中文标题】Hibernate Criteria - 多对多关系【英文标题】:Hibernate Criteria - Many to Many relations 【发布时间】:2017-05-30 21:22:37 【问题描述】:

我正在尝试使用 Hibernate Criteria 进行选择,使用多对多关系中相关的表。 n-m 表有一些额外的列,而不仅仅是每个表的 id。

CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<User> criteria = builder.createQuery(Fornecedor.class);
Root<User> root = criteria.from(User.class );
criteria.select(root);
root.fetch("userRolesList");
List<User> users = em.createQuery(criteria).getResultList();

在 User 类中,我有具有角色的 userRolesList(n-m 表)。所以我有用户-> 用户角色-> 角色。每个属性都映射为 FetchType.LAZY

    例如,当我尝试打印用户角色时,hibernate 会抛出 org.hibernate.LazyInitializationException 导致无法获取角色。

    当我为后面的代码更改代码时。

代码:

CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<User> criteria = builder.createQuery(Fornecedor.class);
Root<User> root = criteria.from(User.class );
criteria.select(root);    
root.fetch("userRolesList");
root.fetch("userRolesList.role");
List<User> users = em.createQuery(criteria).getResultList();

然后我得到:

java.lang.IllegalArgumentException:无法找到属性 此 ManagedType [User] 上的给定名称 [userRolesList.role]

我已经尝试了很多选项来解决这种情况,比如加入,但仍然无法成功。

【问题讨论】:

【参考方案1】:

看来你在抓取方面做得有点过头了。

尝试分步进行:

CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<User> criteria = builder.createQuery(Fornecedor.class);

Root<User> root = criteria.from(User.class );
criteria.select(root);

Fetch<User, UserRoles> userRolesFetch = root.fetch("userRolesList", JoinType.INNER);
Fetch<UserRoles, Role> roleFetch = userRolesFetch.fetch("role", JoinType.INNER);

List<User> users = em.createQuery(criteria).getResultList();

【讨论】:

完美!我错过了“内部获取”。我试图从根目录进行两次提取。完美的!谢谢!

以上是关于Hibernate Criteria - 多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

hibernate 一对多 查询问题

Hibernate 单向/双向 多对多

Hibernate学习8—Hibernate 映射关系(多对多)

hibernate多对多查询

Hibernate-ORM:12.Hibernate中的多对多关联关系

Hibernate多对多关系映射(建表)