JPQL 嵌套连接

问题描述 投票:0回答:1

我有 3 个实体:

@Entity
@Table(name = "users")
data class User(

    @Id
    var email: String? = null,

    @ManyToMany
    @JoinTable(
        name = "user_roles",
        joinColumns = [JoinColumn(name = "USER_ID", referencedColumnName = "EMAIL")],
        inverseJoinColumns = [JoinColumn(name = "ROLE_ID", referencedColumnName = "NAME")]
    )
    var roles: Set<Role>? = null

@Entity
@Table(name = "roles")
data class Role(

    @ManyToMany
    @JoinTable(
        name = "roles_privileges",
        joinColumns = [JoinColumn(name = "ROLE_ID", referencedColumnName = "NAME")],
        inverseJoinColumns = [JoinColumn(name = "PRIVILEGE_ID", referencedColumnName = "NAME")]
    )
    var privileges: Set<Privilege>? = null

@Entity
@Table(name = "privileges")
data class Privilege(

    @Id
    var name: String? = null,
    @ManyToMany(mappedBy = "privileges")
    var roles: List<Role>? = null

我需要提取所有用户的权限 我试过这样的^

    @Query("select p from User u left join fetch u.roles r left join fetch r.privileges p where u.email = :email")
    fun getAllByUserEmail(email: String): Set<Privilege>

但是我收到以下错误:

org.hibernate.query.SemanticException:查询指定连接获取,但获取的关联的所有者不存在于选择列表中 [SqmSetJoin(entity.user.User(u).roles(r))]

有什么想法可以正确地做到这一点吗?

java kotlin hibernate jpa jpql
1个回答
0
投票

尝试获取

User
实体,然后从 User 对象中提取权限,而不是使用查询
Privilege
实体直接获取
User
。实际上Hibernate不能这样映射。 或者 而不是

"select p from User u left join fetch u.roles r left join fetch r.privileges p where u.email = :email"

尝试

SELECT p 
FROM Privilege p 
JOIN p.roles r 
JOIN r.users u 
WHERE u.email = :email
© www.soinside.com 2019 - 2024. All rights reserved.