【问题标题】:How to use declare Stream as return type when dealing with JPA Specification and spring-data-jpa处理 JPA 规范和 spring-data-jpa 时如何使用声明 Stream 作为返回类型
【发布时间】:2017-05-06 18:36:08
【问题描述】:

我想知道是否可以在自定义查询中使用 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 中,但我想留在当前应用程序的设计中并一直使用规范。

【问题讨论】:

  • 没有“JPA 规范”之类的东西;那只是 Spring Data JPA API (!= JPA API)。标签固定
  • 您的标题和问题正文中有不同的问题。您希望我们回答哪一个?

标签: spring spring-data spring-data-jpa jpql


【解决方案1】:

有一种方法可以从我使用的 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)。

此外,您应该注意在处理流时提供连接以保持活动状态。

【讨论】:

    【解决方案2】:

    TL;DR;

    不,不,但手动是

    我认为issue DATAJPA-906 回答了你的两个问题

    1. 问题(来自标题):在处理 JPA 规范和 spring-data-jpa 时如何使用 declare Stream 作为返回类型?

    你没有,至少没有直接支持的方式:

    在 JpaSpecificationExecutor 上支持 Java 8 流

    [..]

    不幸的是,这将不得不等待 2.0 的改进,因为方法签名中的 Stream 会导致接口在 Java

    当然你可以随时add your custom methods including implementation

    1. 问题我可以在自定义查询中使用 JPA 规范谓词吗?(自定义查询是使用 @Query 注释定义的查询

    您如何将通过规范定义的 CriteriaQuery 和手动定义的 JPQL 查询结合起来?

    如果问题不明确:如果您的自定义查询包含内部选择,规范中的标准应该放在哪里?

    你能做什么

    实现一个自定义方法,返回一个Stream,并将一个规范作为参数,结合准备好的规范调用JpaSpecificationExecutor接口的现有方法,并将结果转换为Stream

    【讨论】:

    • 感谢您提供指向 spring-data-jpa 问题的指针,我将等待 2.x 以获取可能“更清洁”的实现 :)
    猜你喜欢
    • 2016-02-17
    • 2019-05-25
    • 2016-07-22
    • 1970-01-01
    • 2021-09-11
    • 2022-01-01
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多