r2dbc ReactiveCrudRepository如何编写JPQL/HQL

SoT*_*SoT 3 java hibernate spring-webflux spring-data-r2dbc

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

public interface BookRepository extends ReactiveCrudRepository<Book, Long> {
}
Run Code Online (Sandbox Code Playgroud)

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

public interface CustomBookRepository extends BookRepository {
    Flux<Book> findByVeryComplicatedCondition(MyCriteriaDto criteria);
}
Run Code Online (Sandbox Code Playgroud)

我的实现:

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?
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

当我问这些问题时,我的意思是“如何使用 Spring React/r2dbc 方式做到这一点”,而不是“如何使用 JDBC 做到这一点”

小智 11

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

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

interface MyRepository extends ReactiveCrudRepository<...> {

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