gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:41:38 24 4
gpt4 key购买 nike

我有以下可以完美运行的 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 - 我尝试过的查询,

这里的所有示例都会引发错误,但是如果您在 native 查询中编写它们并运行它们,它们将按预期工作。所以,我可能不知道如何将它从 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没有映射。您必须以与点所在的其他实体相同的方式编写。

关于java - 无法将 MS Sql 查询转换为 Hibernate @Query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57023561/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com