首页 > 解决方案 > r2dbc ReactiveCrudRepository 如何编写 JPQL/HQL

问题描述

我是 Spring WebFlux 反应式的新手。我使用 R2DBC postgresql。我有一个这样的存储库:

public interface BookRepository extends ReactiveCrudRepository<Book, Long> {
}

现在我想添加自定义方法来查询许多复杂的条件:

public interface CustomBookRepository extends BookRepository {
    Flux<Book> findByVeryComplicatedCondition(MyCriteriaDto criteria);
}

我的实现:

public class CustomBookRepositoryImpl extends CustomBookRepository {

    //How to get it?
    EntityManager em;

    @Override
    public Flux<Book> findByVeryComplicatedCondition(MyCriteriaDto criteria) {
        Query query = em.createQuery("SELECT b from Book b WHERE (VERY COMPLICATED CONDITIONS)");
        //What next?
    }
}

我的问题在上面的代码中:

  1. 如何获取EntityManager?
  2. 如何从我构建的 HQL 查询中获取 Flux?

当我问这些问题时,我的意思是“如何使用 Spring 反应式/r2dbc 方式执行此操作”,而不是“如何使用 JDBC 执行此正常方式”

标签: javahibernatespring-webfluxspring-data-r2dbc

解决方案


Spring Data R2DBC 没有像 Hibernate 这样成熟的 ORM 框架支持。因此不存在 EntityManager 之类的东西,也不可能编写 JQL/HQL 查询。

但是,仍然可以使用本机查询来定义更复杂的方法,例如

interface MyRepository extends ReactiveCrudRepository<...> {

    @Query("SELECT b from Book b WHERE (VERY COMPLICATED CONDITIONS)")
    Flux<...> find(...);
}

推荐阅读