无法将 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 没有映射。您将不得不以与点所在的其他实体相同的方式编写。