无法将 MS Sql 查询转换为 Hibernate @Query
Could not translate MS Sql query to Hibernate @Query
我有以下 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
}
更新 1 - 我试过的查询,
此处的所有示例都会引发错误,但如果您将它们写在本机查询中并 运行 它们,它们将按预期工作。所以,可能是我不知道如何将它从 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);
}
既然你想把它转换成 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
没有映射。您将不得不以与点所在的其他实体相同的方式编写。
我有以下 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
}
更新 1 - 我试过的查询,
此处的所有示例都会引发错误,但如果您将它们写在本机查询中并 运行 它们,它们将按预期工作。所以,可能是我不知道如何将它从 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);
}
既然你想把它转换成 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
没有映射。您将不得不以与点所在的其他实体相同的方式编写。