Я реализовал связь @ManyToMany, но с дополнительной таблицей, используя @OneToMany и @ManyToOne между Пользователь , Роли , Разрешения , а дополнительные таблицы равны " UserRole », " RolePermissions "
один пользователь может иметь несколько ролей, а одна роль также может иметь несколько разрешений. Я должен получить разрешения пользователей на основе ролей. поэтому я написал запрос, который работает нормально
@Query("SELECT DISTINCT p FROM Permission p INNER JOIN p.roles rp INNER JOIN rp.role r INNER JOIN r.users ur INNER JOIN ur.user u WHERE u.id=:userId")
List<Permission> findAllUserRolePermissions(@Param("userId") long userId);
этот запрос выглядит длинным, я хочу сделать его коротким или оптимизировать его, если это возможно.
Сущности следуют здесь
@Entity
@Table(name = "USER")
@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
@JsonIgnore
@OneToMany(targetEntity = UserRole.class, mappedBy = "user", fetch = FetchType.LAZY)
private List<UserRole> roles;
//Role
@Entity
@Table(name = "Role")
public class Role implements Serializable {
@OneToMany(targetEntity = UserRole.class, mappedBy = "role", fetch = FetchType.LAZY)
private List<UserRole> users;
@OneToMany(targetEntity = RolePermission.class, mappedBy = "role", fetch = FetchType.LAZY)
private List<RolePermission> rolePermissions;
//Use_Role
@Entity
@Table(name = "USER_ROLE")
@JsonIgnoreProperties(ignoreUnknown = true)
public class UserRole {
@ManyToOne
@JoinColumn(name = "USER_ID")
private User user;
@ManyToOne
@JoinColumn(name = "ROLE_ID")
private Role role;
//Permission
@Entity
@Table(name = "PERMISSION")
public class Permission {
@OneToMany(targetEntity = RolePermission.class, mappedBy = "permission", fetch = FetchType.LAZY)
private List<RolePermission> roles;
//Role_Permission
@Entity
@Table(name = "ROLE_PERMISSION")
@JsonIgnoreProperties(ignoreUnknown = true)
public class RolePermission {
@ManyToOne
@JoinColumn(name = "ROLE_ID")
private Role role;
@ManyToOne
@JoinColumn(name = "PERMISSION_ID")
private Permission permission;
что я хочу?
1) этот запрос в порядке? или можно улучшить если да то как?
2) могу ли я добиться этого, используя методы интерфейса данных пружины, такие как следующие
List<Permission> findAllUserRolePermissions(List<Role> roles);// all
permissions by roles of user
3) любой ресурс для изучения весенних данных jpa join запросов
Любое предложение будет оценено. Спасибо