jpa Hibernate使用投影初始化惰性字段

cygmwpex  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(156)

我 有 两 个 实体 A 、 B 、 C , 它们 具有 以下 Map 。

@Enttiy
class A {
   @OneToMany
   private List<B> Bs;
}

@Entity
class B {
   @OneToMany
   private List<C> Cs;
}

@Entity
class C {
   private Double x1;
   private Double y1;
   private Double z1;

   private Double x2;
   private Double y2;
   private Double z2;
   
   //...
}

中 的 每 一 个
类 C 是 从 CSV Map 的 表 , 因此 具有 许多 列 。
在 我 的 代码 中 , 我 需要 使用 aRespository.findAll(spec) 并 迭代 所有 B 和 它 的 所有 C 。 用户 可以 选择 C 的 列 的 子集 ( 比如 [x1, x2, z2] ) 。 因此 , sql select from table 将 被 简化 为 select x2, x2, z2 form C
使用 ResultTransformer 编写 一 个 自 定义 查询 是 最 好 的 选择 吗 ? 或者 有 更 简单 的 选择 。 因为 查询 是 为 实体 A 编写 的 , 但 只 修改 了 实体 C 。 如果 可能 的 话 , 我 还 希望 保留 惰性 加载 。

  • 谢谢 - 谢谢
3bygqnnd

3bygqnnd1#

我认为你应该使用DTO方法。基本属性的延迟加载需要额外的设置,这并不值得。最好尽可能多地告诉数据库你需要什么数据。
我认为这是一个完美的Blaze-Persistence实体视图用例。
我创建这个库是为了允许在JPA模型和自定义接口或抽象类定义的模型之间进行简单的Map,就像Spring Data Projections一样。其思想是您可以按照自己喜欢的方式定义目标结构(域模型),并通过JPQL表达式将属性(getter)Map到实体模型。
使用Blaze-Persistence Entity-Views时,您的用例的DTO模型可能如下所示:

@EntityView(A.class)
public interface ADto {
    @IdMapping
    Long getId();
    Set<BDto> getBs();

    @EntityView(B.class)
    interface BDto {
        @IdMapping
        Long getId();
        Set<CDto> getCs();
    }

    @EntityView(C.class)
    interface CDto {
        @IdMapping
        Long getId();
        Double getX1();
        Double getX2();
        Double getZ2();
    }
}

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

Page<ADto> findAll(Pageable pageable);

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

相关问题