如何忽略在JPA NamedEntityGraph中被选中的属性?



我正在我的实体中创建一对NamedEntityGraphs。我已经能够通过不包括NamedAttributeNode中的属性来阻止JPA连接其他表。

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

如何防止hibernate选择这些列?

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

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

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

您将需要dto,我认为这是Blaze-Persistence实体视图的完美用例。

我创建的库允许JPA模型和自定义接口或抽象类定义模型之间的轻松映射,类似于类固醇上的Spring Data projection。其思想是,您以您喜欢的方式定义您的目标结构(域模型),并通过JPQL表达式将属性(getter)映射到实体模型。

一个可能的DTO模型可以像下面这样使用Blaze-Persistence Entity-Views:

@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 projection一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features

Page<UserDto> findAll(Pageable pageable);

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

你说:

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

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

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

而不是使用List<Object[]>,你也可以定义一个DTO类,其中只有两个字段,例如List<TwoColumnDTO>

这可能看起来很乱,而且肯定不如使用纯JPA选择到实体类那么干净。但是这里要记住的是,JPA方法最终只是便利性方法。如果它们能很好地达到你的目的,那就使用它们。否则,对于您的大多数应用程序,您通常会在这里和那里结束一些本地查询,这没有什么错。

相关内容

  • 没有找到相关文章

最新更新