我有一个非常复杂的模型。实体有很多关系等等。
我尝试使用Spring Data JPA并准备了一个存储库。
但是当我调用一个方法findAll()时,指定了一个对象,这就有了一个性能问题,因为对象非常大。我知道这一点,因为当我调用这样的方法时:
@Query(value = "select id, name from Customer ")
List<Object[]> myFindCustomerIds();
我在表演上没有任何问题。
但当我调用
List<Customer> findAll();
我在表演上有很大的问题。
问题是,我需要调用findAll方法与客户规格,这就是为什么我不能使用方法返回一个数组的对象。
如何编写一个方法来查找所有具有Customer
实体规范的客户,但该方法仅返回ID。
就像这样:
List<Long> findAll(Specification<Customer> spec);
- 在这种情况下,我不能使用分页。
请帮帮我
4条答案
按热度按时间xjreopfe1#
为什么不使用
@Query
注解?我看到的唯一缺点是当属性
id
改变时,但由于这是一个非常常见的名称,不太可能改变(id =主键),这应该是可以的。cidc1ykv2#
这现在由Spring Data使用Projections支持:
比
Customer
存储库中的要多编辑:
正如Radouane指出的那样,由于bug的原因,ROUFID投影与规范目前不起作用。
但是你可以使用specification-with-projection库来解决这个Spring Data Jpa的缺陷。
nhn9ugyo3#
我解决了问题。
(As结果我们将有一个稀疏的Customer对象,只有id和name)
自定义仓库:
和一个实现(记住后缀- Impl是默认的)
hpxqektj4#
不幸的是,Projections不适用于规格。
JpaSpecificationExecutor
仅返回类型为存储库管理的聚合根的List(List<T> findAll(Specification<T> var1);
)一个实际的解决方法是使用Tuple。范例:
其中
Projections
是根投影的功能接口。SingleTupleMapper
和TupleMapper
用于将TupleQuery
结果Map到要返回的Object。用途:
我希望能帮上忙。