Spring with Hibernate - SQL -按条件返回包含嵌套列表的对象列表

i34xakig  于 2022-12-13  发布在  Spring
关注(0)|答案(1)|浏览(123)

我使用Spring和Hibernate、MySQL、JPQL。我的存储库中有这样一个方法:

@Query("""
  SELECT w FROM Window w
  LEFT JOIN w.ramps r
  WHERE r.isDeleted = false
  AND w.id = :id
""")

@EntityGraph(attributePaths = {"warehouse", ...})
Optional<Window> findByIdWithNotDeletedRamps(long id);

我的目标:我想获取所有依赖ramps的窗口,但只获取未删除rampsramp.isDeleted = false)的窗口。如果窗口只删除了ramps,那么我应该会收到这样一个带有ramps空列表的窗口
到目前为止,我获取了所有的窗口,然后在代码过滤window.rampsMapstruct接收windows与只没有删除(isDeleted标志= false)斜坡。我想知道如何写sql接收windows与只没有删除ramps的列表?这是可能的吗?
我已经尝试了上面的代码,但这是一个坏的方法,因为当windows没有任何斜坡,然后这个特定的window是不接收。

0aydgbwb

0aydgbwb1#

您应该为此使用DTO,我认为这是Blaze-Persistence实体视图的完美用例。
我创建这个库是为了允许在JPA模型和自定义接口或抽象类定义的模型之间进行简单的Map,就像Spring Data Projections一样。其思想是,您可以按照自己喜欢的方式定义目标结构(域模型),并通过JPQL表达式将属性(getter)Map到实体模型。
使用Blaze-Persistence Entity-Views时,您的用例的DTO模型可能如下所示:

@EntityView(Window.class)
public interface WindowDto {
    @IdMapping
    Long getId();
    String getName();
    @Mapping("ramps[isDeleted = false]")
    Set<RampDto> getRamps();

    @EntityView(Ramp.class)
    interface RampDto {
        @IdMapping
        Long getId();
        String getName();
    }
}

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

Page<WindowDto> findAll(Pageable pageable);

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

相关问题