我正在我的实体中创建一对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方法最终只是便利性方法。如果它们能很好地达到你的目的,那就使用它们。否则,对于您的大多数应用程序,您通常会在这里和那里结束一些本地查询,这没有什么错。