我有以下运行良好的MS SQL查询。
select u.id, u.username, r2.authority, em.hrt02_first_name, em.hrt02_last_name from users as u
inner join group_members gm
on u.id = gm.user_id
inner join groups g
on gm.group_id = g.id
inner join group_authorities ga
on ga.group_id = g.id
inner join roles r2
on ga.role_id = r2.id
inner join hrt02_employee_name em
on em.id = u.id
where u.username = 'john'
输出如下
+----+----------+------------+------------------+-----------------+
| id | username | authority | hrt02_first_name | hrt02_last_name |
+----+----------+------------+------------------+-----------------+
| 1 | john | ROLE_ADMIN | fname | lname |
+----+----------+------------+------------------+-----------------+
| 1 | john | ROLE_USER | fname | lname |
+----+----------+------------+------------------+-----------------+
但是当我尝试将其转换为Hibernate Query或`@Query(...,nativeQuery = true)时,它将引发异常。 (无法延迟初始化,并且无法加入路径)。
这是我的架构设计
@Entity
public class Users {
// id, username omitted
@ManyToMany
@JoinTable(name="group_members", joinColumns=@JoinColumn(name="user_id", referencedColumnName="id"), inverseJoinColumns=@JoinColumn(name="group_id", referencedColumnName="id"))
private List<Groups> groups;
}
@Entity
public class Groups {
// id omitted
@ManyToMany
@JoinTable(name="group_authorities", joinColumns=@JoinColumn(name="group_id", referencedColumnName="id"), inverseJoinColumns=@JoinColumn(name="role_id", referencedColumnName="id"))
private List<Roles> roles;
}
@Entity
public class Roles {
// id omitted, authority
}
@Entity
public class Hrt02EmployeeName {
// id, firstname, lastname omitted
}
这里的所有示例都会引发错误,但是如果您在本机查询中编写它们并运行它们,它们将按预期工作。因此,可能是我不知道如何将其从nativeQuery转换为Hibernate Query。
public interface UsersRepository extends JpaRepository<Users, Long> {
@Query(value =
"select * from users as u" +
" inner join group_members gm" +
" on u.id = gm.user_id" +
" inner join groups g" +
" on gm.group_id = g.id" +
" inner join group_authorities ga" +
" on ga.group_id = g.id" +
" inner join roles r2" +
" on ga.role_id = r2.id" +
" inner join hrt02_employee_name em" +
" on em.id = u.id" +
" where u.username = :qryusername", nativeQuery = true)
public Users findRoleByUsername(@Param("qryusername") String username);
@Query("select distinct u.username, r2.authority from Users as u " +
" inner join group_members gm " +
" on u.id = gm.user_id " +
" inner join Groups g " +
" on gm.group_id = g.id " +
" inner join group_authorities ga " +
" on ga.group_id = g.id " +
" inner join Roles r2 " +
" on ga.role_id = r2.id" +
" inner join hrt02_employee_name em" +
" on em.id = u.id" +
" where u.username = :username")
public Users findRoleByUsername(@Param("username") String username);
@Query(value =
"select u from Users u" +
" inner join GroupMembers gm" +
" on u.id = gm.user_id" +
" inner join Groups g" +
" on gm.group_id = g.id" +
" inner join GroupAuthorities ga" +
" on ga.group_id = g.id" +
" inner join Roles r2" +
" on ga.role_id = r2.id" +
" inner join hrt02_employee_name em" +
" on em.id = u.id" +
" where u.username = :username")
public Users findRoleByUsername(@Param("username") String username);
}
答案 0 :(得分:1)
由于要将其转换为User
,因此必须构造它,而不是u.username, r2.authority
。其次,您需要获取用于避免LazyInitializationException
的内容:
@Query("select distinct u from Users u " +
" left join fetch u.groups g "
" left join fetch g.roles r " +
" ... "
" where u.username = :username")
public Users findRoleByUsername(@Param("username") String username);
这是开始,因为您的实体Role
没有映射。您将不得不以其他方式将点所在的其他实体写成相同的方式。