我尝试使用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
当我尝试打印用户角色时,例如,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]
我已尝试过多种选择,例如连接,但仍无法使其正常工作。
答案 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();