停止获取jpa中的相关实体



我有以下数据模型:

  • 存在角色组和角色
  • 每个角色可以属于一个或多个角色组(多个(
  • 有特权
  • 每个特权可以属于一个或多个角色(多个(

这是实体定义:

角色组:

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();
}

这样,我就可以根据dto在正确的结构中获得正确的数据,但特权也会被查询(通过额外的查询(。当然,这是因为提取的roles字段,因为role的所有其他属性都将被急切地提取。但我不需要它。我只需要来自role实体的idname字段。

我怎样才能做到这一点?

如何验证Role的集合是否已初始化?我想是通过你的调试器?请注意,调试器在向您显示对象内容时将调用对象的toString方法,这将导致惰性集合的初始化。

也许这也是你的对象映射器的错,不确定你是怎么做到的。我认为这是Blaze Persistence实体视图的一个完美用例。

我创建了这个库,以便在JPA模型和自定义接口或抽象类定义模型之间进行简单的映射,比如类固醇上的Spring Data Projections。其思想是,您可以按照自己喜欢的方式定义目标结构(域模型(,并通过JPQL表达式将属性(getter(映射到实体模型。

使用Blaze Persistence实体视图,用例的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 Projections一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-数据特征

Page<RoleGroupWithRolesDto> findAll(Pageable pageable);

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

最新更新