Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring数据JPA-使用@Query处理多对多关系/联接表_Java_Spring_Spring Data_Spring Data Jpa - Fatal编程技术网

Java Spring数据JPA-使用@Query处理多对多关系/联接表

Java Spring数据JPA-使用@Query处理多对多关系/联接表,java,spring,spring-data,spring-data-jpa,Java,Spring,Spring Data,Spring Data Jpa,我有一个用户实体,与角色实体有多对多关系 @Entity @Table(name = "auth_user") public class OAuthUser { // @Autowired // @Transient // private PasswordEncoder passwordEncoder; // @Id @GeneratedValue(strategy = GenerationType.IDENTITY) priva

我有一个用户实体,与角色实体有多对多关系

    @Entity
@Table(name = "auth_user")
public class OAuthUser {

    // @Autowired
    // @Transient
    // private PasswordEncoder passwordEncoder;
    //
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "username")
    private String userName;

    @Column(name = "password")
    @JsonIgnore
    private String password;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

    @Column(name = "email")
    private String email;

    @Column(name = "is_enabled")
    private boolean isEnabled;

    /**
     * Reference:
     * https://github.com/nydiarra/springboot-jwt/blob/master/src/main/java/com/nouhoun/springboot/jwt/integration/domain/User.java
     * Roles are being eagerly loaded here because they are a fairly small
     * collection of items for this example.
     */
    @ManyToMany(fetch = FetchType.EAGER)
    @Fetch(value = FetchMode.SUBSELECT)
    @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"))
    private List<Role> roles;

    @ManyToMany(fetch = FetchType.EAGER)
    @Fetch(value = FetchMode.SUBSELECT)
    @JoinTable(name = "user_properties", joinColumns = @JoinColumn(name = "AuthID", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "PropertyID", referencedColumnName = "id"))
    private List<Property> properties;
上面的代码导致错误
auth\u未映射用户
。我确实理解为什么我会出错;框架使用实体名称(OAuthUser)而不是表(auth_user)来执行查询。这通常不会有问题,除非没有
用户角色的实体
;它只是一个包含两列的联接表:“user\u id”和“role\u id”

实现这一目标的适当方式是什么

谢谢。

错误显示:

未映射身份验证用户


它是指查询中使用的
auth\u用户
,如
SELECT u FROM auth\u user
。在查询中,它必须是
OAuthUser

您正在jpql@query中使用表名(auth_user)。您应该使用类名OAuthUser

@Query("SELECT u FROM OAuthUser u ...")
public List<OAuthUser> findByRole(int roleID);
@Query(“从OAuthUser u中选择u…”)
公共列表findByRole(introleid);
如果要使用SQL而不是jpql,则需要如下使用:

@Query(value = "SELECT * FROM auth_user ..." , nativeQuery=true)
public List<OAuthUser> findByRole(int roleID);
@Query(value=“SELECT*FROM auth\u user…”,nativeQuery=true)
公共列表findByRole(introleid);

这样您就可以提到表名和列。

谢谢。我明白。抱歉,如果我不清楚,但我的问题是如何为
用户\u角色
执行此操作,因为它不是
@实体
,而只是一个联接表?请检查答案,无需在查询中显式使用联接表。谢谢。我道歉;我没有意识到这最终会是一个复制品。作为参考,我的目标的正确查询是
@query(“从OAuthUser中选择u作为u加入u.roles作为r,其中r.id=?1和u.isEnabled=true”)
,而我已经用另一种方式解决了它,谢谢你的回答。本机查询选项看起来很有用。我意识到需要在
@Query
中使用类名,但是对于联接表,没有类名。再次感谢。希望您不是以明文形式存储密码,而是未能命名字段passwordHash!
@Query(value = "SELECT * FROM auth_user ..." , nativeQuery=true)
public List<OAuthUser> findByRole(int roleID);