我有 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))]
有什么想法可以正确地做到这一点吗?
尝试获取
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