Объединение запросов с несколькими таблицами в Spring Data JPA - PullRequest
0 голосов
/ 29 апреля 2018

Я реализовал связь @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 запросов

Любое предложение будет оценено. Спасибо

...