[英]How to get data when query select inner join many table in Spring Data JPA
[英]Spring Data JPA - Using @Query with Many to Many Relationships / Join Table
我有一个与角色实体具有多对多关系的用户实体。
@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;
我正在使用 Spring 数据 JPA 存储库,并且能够创建一个自定义@Query
来返回基于特定角色 ID 的用户列表。
@Query("SELECT u FROM auth_user as u WHERE u.isEnabled AND u.id IN"
+ " (SELECT r.user_id FROM user_role as r WHERE r.role_id = ?1)")
public List<OAuthUser> findByRole(int roleID);
上面的代码导致错误auth_user is not mapped
。 我确实理解为什么会收到错误消息; 该框架使用实体名称 (OAuthUser) 而不是表 (auth_user) 来执行查询。 这通常不会成为问题,除非user_role
没有实体; 它只是一个包含两列的连接表:“user_id”和“role_id”。
实现这一目标的适当方法是什么?
谢谢。
错误说:
auth_user 未映射
它指的是查询中使用的 auth_user,例如auth_user
SELECT u FROM auth_user
。 在查询中,它必须是OAuthUser
。
您正在使用 jpql @Query 内部的表名(auth_user)。 您应该改用 class 名称OAuthUser :
@Query("SELECT u FROM OAuthUser u ...")
public List<OAuthUser> findByRole(int roleID);
如果要使用 SQL 而不是 jpql,则需要这样使用:
@Query(value = "SELECT * FROM auth_user ..." , nativeQuery=true)
public List<OAuthUser> findByRole(int roleID);
这样你就可以提到表名和列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.