spring-data-jpa 停止提取jpa中的相关实体

zlhcx6iw  于 2022-11-10  发布在  Spring
关注(0)|答案(1)|浏览(205)

我有以下数据模型:

  • 有角色组和角色
  • 每个角色可以属于一个或多个角色组(多对多)
  • 有特权
  • 每个权限可以属于一个或多个角色(多对多)

这是实体定义:
角色组:

public class RoleGroup {
  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_role_group")
  @SequenceGenerator(name = "seq_role_group", allocationSize = 1)
  @Column(nullable = false, updatable = false)
  private Long id;

  private String name;

  @ManyToMany(fetch = FetchType.LAZY)
  @JoinTable(name = "role_groups_roles", joinColumns = @JoinColumn(name = "role_group_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"))
  private Set<Role> roles;

}

角色:

public class Role {
  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_role")
  @SequenceGenerator(name = "seq_role", allocationSize = 1)
  @Column(nullable = false, updatable = false)
  private Long id;

  private String name;

  @ManyToMany(mappedBy = "roles")
  private List<AppUser> users;

  @ManyToMany(fetch = FetchType.LAZY)
  @JoinTable(name = "roles_privileges", joinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "privilege_id", referencedColumnName = "id"))
  private Set<Privilege> privileges;
}

现在,我想查询具有相应角色(id,name)的所有角色组(id,name),而不需要任何其他数据(如特权)。
为此,我创建了以下dtos:

public class RoleGroupWithRolesDto {
    private Long id;
    private String name;
    private List<RoleDto> roles;
}

public class RoleDto {
    @NotNull(groups = {Existing.class})
    private Long id;

    @NotEmpty(groups = {New.class, Existing.class})
    private String name;

}

然后在存储库界面中显示以下查询:

public interface RoleGroupRepository extends JpaRepository<RoleGroup, Long> {
    @EntityGraph(type = EntityGraph.EntityGraphType.FETCH, attributePaths = {
            "roles" })
    List<RoleGroup> findAll();

}

这样我就可以根据dtos在正确的结构中得到正确的数据,但是权限也会被查询(需要额外的查询)。当然,这是因为获取了roles字段,因为role的所有其他属性都将被急切地获取。但是我不需要它。我只需要role实体中的idname字段。
我如何才能做到这一点?

jvlzgdj9

jvlzgdj91#

如何验证Role的集合是否已初始化?我猜是通过调试器吧?注意,调试器在向您显示对象内容时将调用对象的toString方法,这将导致惰性集合的初始化。
也许这也是你的对象Map器的错,不知道你是怎么做到的。我认为这是一个完美的Blaze-Persistence实体视图的用例。
我创建这个库是为了允许在JPA模型和自定义接口或抽象类定义的模型之间进行简单的Map,就像Spring Data Projections一样。其思想是您可以按照自己喜欢的方式定义目标结构(域模型),并通过JPQL表达式将属性(getter)Map到实体模型。
使用Blaze-Persistence Entity-Views时,您的用例的DTO模型可能如下所示:

@EntityView(RoleGroup.class)
public interface RoleGroupWithRolesDto {
    @IdMapping
    Long getId();
    String getName();
    Set<RoleDto> getRoles();

    @EntityView(Role.class)
    interface RoleDto {
        @IdMapping
        Long getId();
        String getName();
    }
}

查询是将实体视图应用于查询的问题,最简单的是按id查询。
RoleGroupWithRolesDto a = entityViewManager.find(entityManager, RoleGroupWithRolesDto.class, id);
Spring Data 集成允许您像Spring Data 投影一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features

Page<RoleGroupWithRolesDto> findAll(Pageable pageable);

最好的部分是,它只会获取实际需要的状态!

相关问题