无法将MS Sql查询转换为Hibernate @Query

时间:2019-07-13 23:39:10

标签: java sql sql-server hibernate jpa

我有以下运行良好的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);
}

1 个答案:

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