java 使用@JoinTable返回指定的相关记录

dkqlctbz  于 2023-02-14  发布在  Java
关注(0)|答案(1)|浏览(122)

我有一个用户实体(表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);

}
4ngedf3f

4ngedf3f1#

在User类中使用@Where而不是@WhereJoinTable可解决此问题

相关问题