【问题标题】:How to use Spring Data JPA to search for a non unique index?如何使用 Spring Data JPA 搜索非唯一索引?
【发布时间】:2019-06-08 10:44:40
【问题描述】:

我正在使用带有用户角色的 Spring Security 学习 Spring Data JPA,我想知道如何使用 Spring Data JPA 来搜索非唯一索引。例如我有 3 个 MySQL 表,这是连接表:

我想查找特定用户的所有角色。所以我想通过 user_id 在 user_role 表中搜索,这不是唯一键。

用户实体:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="user")
public class AppUser {

    @Id
    @GeneratedValue
    @Column(name="user_id")
    private long id;

    private String username;
    private String password;
    private boolean enabled;

    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public boolean isEnabled() {
        return enabled;
    }
    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }

}

角色实体:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="role")
public class AppRole {

    @Id
    @GeneratedValue
    @Column(name="role_id")
    private long id;

    private String name;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

User_Role 实体:

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="user_role")
public class UserRole {

    @Id
    @GeneratedValue
    private long id;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="user_id")
    private AppUser appUser;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="role_id")
    private AppRole appRole;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public AppUser getAppUser() {
        return appUser;
    }

    public void setAppUser(AppUser appUser) {
        this.appUser = appUser;
    }

    public AppRole getAppRole() {
        return appRole;
    }

    public void setAppRole(AppRole appRole) {
        this.appRole = appRole;
    }
}

我想为 Spring Security 创建 UserDetails,因为我想使用用户角色。我需要找到特定用户的所有角色。我创建了扩展 JpaRepository 的存储库接口,但我不知道如何搜索 user_id。我可以使用 Spring Data JPA 来搜索这个 user_id 吗?类似于 userRoleRepository.findByUserId(user.getId)。任何反馈都将不胜感激!

【问题讨论】:

    标签: java spring-boot jpa spring-security spring-data-jpa


    【解决方案1】:

    在我看来,您的实体有问题,您不需要 UserRole 实体,即使您需要连接表。

    JPA 允许您使用 @ManyToMany@JoinTable 注释来做到这一点:

    pubic class User {
      ...
      @ManyToMany
      @JoinTable(name="USER_ROLE")
      private List<Role> roles;
      ...
    }
    

    这样,您可以先使用用户存储库轻松获取用户,然后使用与其关联的角色。

    User user = userRepository.findOne(userId);
    List<Role> roles = user.getRoles();
    

    【讨论】:

    • 谢谢你,马特,我知道如何使用 @ManytoMany 以这种方式做到这一点,但我想以另一种方式做到这一点,我在这里找到了本教程:o7planning.org/en/11705/…,我明白了他使用 JPA,我想知道是否可以使用 Spring Data Jpa
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 2014-05-30
    • 2015-11-20
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多