我有一个用户实体(表user_entity),该表与角色链接(table keycloak_role)通过引用表user_role_mapping。用户可以有多个角色。我需要接收一个client_role = false的用户。由于引用表的名称与hib预期的不同,我使用了@JoinTable来让它知道正确的引用表名称。但是当我运行它时,我收到了一个具有所有角色的用户。我已经将@WhereJoinTable添加到角色列表中,但Hibernate构建了一个不正确的查询,并试图访问引用表user_role_mapping中的client_role列。我该如何修复它?
用户类别
@Entity
@Table(name = "user_entity")
@Getter
@Setter
@EqualsAndHashCode
public class UserEntity {
@Id
@Column(name = "id")
private String id;
private String email;
@Column(name = "email_constraint")
private String emailConstraint;
@Column(name = "email_verified")
private String emailVerified;
private boolean enabled;
@Column(name = "federation_link")
private String federationLink;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
private String username;
@Column(name = "created_timestamp")
private Long createdAt;
@OneToMany(fetch = FetchType.LAZY)
@JoinTable(
name = "user_group_membership",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "group_id")
)
private List<Group> groups;
@OneToMany(fetch = FetchType.LAZY)
@JoinTable(
name = "user_role_mapping",
joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id")
)
@WhereJoinTable(clause = "client_role = false")
private List<Role> realmRoles;
}
角色类
@Entity(name = "keycloak_role")
@Table(name = "keycloak_role")
@Getter
@Setter
public class Role {
@Id
private String id;
private String name;
}
从日志进行Hibernate查询。最后一个WHERE是错误的地方
Hibernate:
select
*
from
user_entity ue
join
user_group_membership ugm
on ugm.user_id = ue.id
join
keycloak_group kg
on kg.id = ugm.group_id
join
realm r
on r.id = ue.realm_id
where
username = ?
and r.id = 'CSP'
and kg.name in (
?, ?
)
Hibernate:
select
userattrib0_.id as id1_2_,
userattrib0_.name as name2_2_,
userattrib0_.user_id as user_id4_2_,
userattrib0_.value as value3_2_
from
user_attribute userattrib0_
left outer join
user_entity userentity1_
on userattrib0_.user_id=userentity1_.id
where
userentity1_.id=?
Hibernate:
select
groups0_.user_id as user_id1_4_0_,
groups0_.group_id as group_id2_4_0_,
group1_.id as id1_0_1_,
group1_.name as name2_0_1_
from
user_group_membership groups0_
inner join
keycloak_group group1_
on groups0_.group_id=group1_.id
where
groups0_.user_id=?
Hibernate:
select
realmroles0_.user_id as user_id1_5_0_,
realmroles0_.role_id as role_id2_5_0_,
role1_.id as id1_1_1_,
role1_.name as name2_1_1_
from
user_role_mapping realmroles0_
inner join
keycloak_role role1_
on realmroles0_.role_id=role1_.id
where
(
realmroles0_.client_role = false
)
and realmroles0_.user_id=?
如果我尝试做的事情还不可能实现,我想我将不得不在我的repo中使用原生查询。但是它并没有像预期的那样工作,仍然返回所有角色。然而,如果我通过控制台运行这个查询,它返回了3条记录,这些记录具有我需要的确切角色。
储存库
@Repository
public interface UserRepository extends JpaEntryRepository<UserEntity> {
@Query(value = "select * from user_entity ue " +
"join user_group_membership ugm on ugm.user_id = ue.id " +
"join keycloak_group kg on kg.id = ugm.group_id " +
"join realm r on r.id = ue.realm_id " +
"join user_role_mapping urm on ue.id = urm.user_id " +
"join keycloak_role kr on urm.role_id = kr.id " +
"where username = :username " +
"and r.id = 'REALM' " +
"and kr.client_role = false " +
"and kg.name in :groups ",
nativeQuery = true)
Optional<UserEntity> findByUsernameAndGroups(@Param("username") String username,
@Param("groups") List<String> groups);
}
1条答案
按热度按时间4ngedf3f1#
在User类中使用@Where而不是@WhereJoinTable可解决此问题