java - 如何使用分页进行动态 Spring (Boot) JPA 查询?

标签 java sql spring spring-boot jpa

为了过度简化问题:我们有一个类/表 Wine(表“葡萄酒”),其中包括以下属性:

  • 名称:字符串
  • 描述:字符串
  • 产地:产地

  • ...其中 Origin 是另一个类(带有表“origins”),只有 region: Stringcountry: String .
    我正在尝试在我的存储库中创建一个供 RestController 使用的搜索方法。
    RestController 中的方法声明是这样的:
    @GetMapping("/search")
    public Wine searchProduct(
            @RequestParam Optional<String> searchTerm,
            @RequestParam Optional<Origin> origin) {
        // ???
    }
    
    我现在要做的是:为使用 searchTerm 的数据库创建一个查询(如果给定),与原点相同。它应该是可分页的。
    例子:
    SELECT * FROM wines JOIN origins ON wines.origin_id = origins.id 
        WHERE (name LIKE $searchTerm OR description LIKE $searchTerm) AND (/*origin check*/)
    
    如果未给出搜索词,则整个“() AND”部分不应出现在查询中。如果没有给出起源......你会得到它。
    我尝试过的事情:
  • (天真地)在我的存储库中构建大量查询(实现 CrudRepository),如 here .Page<Wine> findWinesByNameLikeOrDescriptionLikeAndOriginEquals(..., Pageable pageable);
  • 哪个(除了 super 丑,特别是对于更多属性)可能不起作用,因为:
  • 没有定义 OR 还是 AND 更重要(没有括号)。
  • 不知道我是否可以将一个“起源”对象推到那里让它工作。
  • 如果这是自定义方法,不知道 Pageable 是否甚至可以工作。


  • 使用 spring.io 建议的“规范和 Querydsl”here .
  • 我只是愚蠢地理解,尤其是在帖子底部的那些 Q 类或开头的 _ 类。对于它应该做的事情来说,它似乎太复杂了。
  • 也没有分页选项。但是,有一个可能的修复方法,例如 here但我没有得到它,因为使用那些 _ 和/或 Q 类是一个很大的开销开始。

  • 还有 this只是我从 2013 年发现的一个例子,我什至不了解一般情况,但看起来它非常合适。
  • 最佳答案

    如果您觉得难以理解 Specifications ,只有这两个搜索参数并假设 Wine实体有一个 @ManyToOneOrigin ,您可以执行以下操作:

        @Query("SELECT w FROM wines w join w.origin o where " +
                "(   :searchTerm is null or " +
                "    w.name like CONCAT('%',:searchTerm ,'%') or " +
                "    w.description like CONCAT('%', :searchTerm ,'%')" +
                ") " +
                "AND (:origin is null or  o = :origin)")
        Page<Wine> searchWines(String searchTerm, Origin origin, Pageable p);
    
    当你打电话时,
        wineRepository.searchWines(searchTerm.orElse(null), origin.orElse(null));
    

    关于java - 如何使用分页进行动态 Spring (Boot) JPA 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63061380/

    相关文章:

    java - 在什么情况下,java项目的Classpath会与其Buildpath不同?

    java - Java中读取文件和空指针异常

    mysql - 标记文章选择 - 更复杂的情况(由逻辑表达式定义的标记)

    SQL - 字符串比较忽略空格

    java - Oracle + dbunit 获取 AmbiguousTableNameException

    具有@OneToMany关系的Java Spring Data @Query不返回任何结果

    java - Kundera cassandra - 事务回滚和实体更新

    java - 以编程方式停止 H2 数据库

    java - 在 Java Spring 框架中从字符串调用存储库

    Swagger 的 Spring Boot 骨架