JPA查询来自3列连接表

时间:2015-07-08 05:13:15

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

我有以下实体。意味着用户可以属于许多企业,并且对于每个企业,此用户可以拥有单独的权限。因此可以将现有用户分配给另一个企业。 Business_User表如下所示:

USER_ID  BUSINESS_ID    AUTHORITY_NAME  
6         1             ROLE_ANALYTICS
6         1             ROLE_SELF_ANALYTICS
7         1             ROLE_REVIEWS
8         1             ROLE_ANALYTICS
8         1             ROLE_SELF_ANALYTICS
8         1             ROLE_REVIEWS
6         2             ROLE_REVIEWS
6         2             ROLE_SELF_ANALYTICS

问题:我通过尝试构建用户DTO对象列表来查询用户的一项业务,DTO公开了List<Authority>,问题是我无法弄清楚我应该如何获得Business_User表中每个用户的这些权限。一直试图用lambdas做奇特的东西,但没有运气。我使用Spring Data进行查询,也许可以在存储库中解决它。

提前致谢。

编辑:如果我想通过添加新的联接表BUSINESS_USER_AUTHORITY去另一条路线,我将如何在UserBusiness课程中对其进行描述?我也希望主键超过user_id和business_id。请注意,nameAuthority表中的PK。

这样的东西,但这根本不会创建我的联接表。

更改 UserBusiness 类:

  @ManyToMany(fetch = FetchType.EAGER)
  @JoinTable(
      name = "BUSINESS_USER_AUTHORITY",
      joinColumns = {@JoinColumn(name = "business_user_id", referencedColumnName = "id")},
      inverseJoinColumns = {@JoinColumn(name = "authority_name", referencedColumnName = "name")})
  private Set<Authority> authorities = new HashSet<>();

用户

@Entity
@Table(name = "USER")
public class User extends AbstractAuditingEntity implements Serializable {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  @OneToMany(cascade = CascadeType.ALL)
  @JoinColumns({
    @JoinColumn(name = "user_id", referencedColumnName = "id")
  })
  private Set<BusinessUser> businessUsers = new HashSet<>();
}

BusinessUser

@Entity
@Table(name = "BUSINESS_USER")
@IdClass(BusinessUser.class)
public class BusinessUser implements Serializable {

  @Id
  @ManyToOne(fetch = FetchType.EAGER)
  @JoinColumn(name = "user_id")
  private User user;

  @Id
  @ManyToOne(fetch = FetchType.EAGER)
  @JoinColumn(name = "business_id")
  private Business business;

  @Id
  @ManyToOne(fetch = FetchType.EAGER)
  @JoinColumn(name = "authority_name")
  private Authority authority;

}

商家

@Entity
@Table(name = "BUSINESS")
public class Business implements Serializable {

  @OneToMany(cascade = CascadeType.ALL)
  @JoinColumns({
    @JoinColumn(name = "business_id", referencedColumnName = "id")
  })
  private Set<BusinessUser> businessUsers = new HashSet<>();

}

授权

@Entity
@Table(name = "AUTHORITY")
public class Authority implements Serializable {

  @NotNull
  @Size(min = 0, max = 50)
  @Id
  @Column(length = 50)
  private String name;
}

1 个答案:

答案 0 :(得分:0)

我最终编写了这样的函数,但是如果有人有解决方案,那么DesignUser&lt; - &gt;之间的另一个连接表将如何看待设计? BusinessUserAuthority然后我很乐意实现它。

  private Function<Map.Entry<User, List<BusinessUser>>, UserManagementDTO> getPermissionForUser() {
    return user -> {
      UserManagementDTO dto = userManagementMapper.userToUserManagementDTO(user.getKey());
      dto.setAuthorities(user.getValue().stream().map(BusinessUser::getAuthority).collect(Collectors.toSet()));
      return dto;
    };
  }