【问题标题】:How to ignore attributes from being SELECTed in JPA NamedEntityGraph?如何忽略在 JPA NamedEntityGraph 中选择的属性?
【发布时间】:2021-11-16 02:28:39
【问题描述】:

我在我的实体中创建了几个NamedEntityGraphs。 通过不在NamedAttributeNode 中包含该属性,我已经能够阻止 JPA 加入其他表。

但是对于日期、字符串等其他属性,它们将始终出现在 Hibernate 生成的查询中。

如何防止休眠选择这些列?

请不要告诉我在视图层忽略它,不获取其余列的目的是为了优化查询/网络。

我也知道我可以在我的 spring 存储库中使用 @Query,但我想保持我的存储库干净。

对于不创建具有较少属性的新实体类也是如此,我想重用实体。

【问题讨论】:

    标签: java hibernate jpa spring-data


    【解决方案1】:

    你说:

    我也知道我可以在我的 spring 存储库中使用 @Query,但我想保持我的存储库干净。

    不选择某些属性的最常见方法是使用本机 SQL 查询,它只选择您想要的列,例如

    @Query(value = "SELECT col1, col2 FROM some_table", nativeQuery = true)
    List<Object[]> findOnlyTwoColumnsFromTable();
    

    除了使用List&lt;Object[]&gt;,您还可以定义一个只有两个字段的 DTO 类,例如List&lt;TwoColumnDTO&gt;.

    这可能看起来很混乱,而且肯定不如使用纯 JPA 来选择实体类那么干净。但这里要记住的是,JPA 方法归根结底只是方便 方法。如果它们很好地满足了您的目的,请使用它们。否则,对于您的大多数应用程序,您通常会在这里和那里得到一些本机查询,这并没有错。

    【讨论】:

      【解决方案2】:

      为此,您将需要 DTO,我认为这是 Blaze-Persistence Entity Views 的完美用例。

      我创建了该库以允许在 JPA 模型和自定义接口或抽象类定义模型之间轻松映射,例如 Spring Data Projections on steroids。这个想法是您按照自己喜欢的方式定义目标结构(域模型),并通过 JPQL 表达式将属性(getter)映射到实体模型。

      使用 Blaze-Persistence Entity-Views 的可能 DTO 模型如下所示:

      @EntityView(User.class)
      public interface UserDto {
          @IdMapping
          Long getId();
          String getName();
          Set<RoleDto> getRoles();
      
          @EntityView(Role.class)
          interface RoleDto {
              @IdMapping
              Long getId();
              String getName();
          }
      }
      

      查询是将实体视图应用于查询的问题,最简单的就是通过 id 进行查询。

      UserDto a = entityViewManager.find(entityManager, UserDto.class, id);

      Spring Data 集成让您可以像使用 Spring Data Projections 一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features

      Page<UserDto> findAll(Pageable pageable);
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-04
        • 1970-01-01
        • 1970-01-01
        • 2020-11-10
        • 1970-01-01
        • 1970-01-01
        • 2021-08-14
        • 1970-01-01
        相关资源
        最近更新 更多