Hibernate Criteria - 多对多关系

时间:2017-05-30 21:22:38

标签: java hibernate orm many-to-many

我尝试使用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表),它有角色。所以我有用户 - &gt; UserRoles - &gt;角色。每个属性都映射为FetchType.LAZY

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

  2. 当我更改后续代码时。

  3. 代码:

    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 个答案:

答案 0 :(得分: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();