gpt4 book ai didi

spring - 处理JPA规范和spring-data-jpa时如何使用声明Stream作为返回类型

转载 作者:行者123 更新时间:2023-12-04 18:26:02 25 4
gpt4 key购买 nike

我想知道是否可以在自定义查询中使用 JPA 规范谓词?

我试过了,但没有成功。

假设我有一个实体 Customer和一个存储库:

@Repository
public interface CustomerRepository
extends JpaRepository<Customer, Long>,
JpaSpecificationExecutor<Customer> {
}

像这样查询是可以的
@Query("select c from Customer c")
Stream<Customer> streamAllCustomers();

这不行
Stream<Customer> streamAllCustomersWithFilter(Specification<Customer> filter);

有没有办法实现这一目标?

注意,我知道我可以将参数放入 @Query但我想留在当前应用程序的设计中,并一直使用规范。

最佳答案

有一种方法可以从我使用的 Spring Data JPA 流式传输数据。
这种方法对于处理大量数据很有用,同时避免高内存消耗,因为整个查询结果不会加载到内存中。

创建 custom individual repository具有以下实现

public class YourCustomRepositoryImpl implements YourCustomRepository {

@PersistenceContext(unitName = "yorEntityManagerFactory")
private EntityManager em;

@Override
public Stream<SomeEntity> streamAll(Specification<SomeEntity> spec) {

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<SomeEntity> query = cb.createQuery(SomeEntity.class);
Root<SomeEntity> root = query.from(SomeEntity.class);
query.where(spec.toPredicate(root, query, cb));

return em.createQuery(query).getResultStream();
}

}

当然,这需要 JPA 2.2 支持 ORM 框架(我使用了 Hibernate 5.3)。

此外,您应该注意在处理流时提供一个处于事件状态的连接。

关于spring - 处理JPA规范和spring-data-jpa时如何使用声明Stream作为返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41261051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com