当前位置: 首页 > 知识库问答 >
问题:

如何使用分页生成动态Spring(引导)JPA查询?

公良安邦
2023-03-14

为了简化这个问题,我们有一个类/餐桌酒(餐桌“wines”),除其他属性外,它具有:

    null

我试图在我的存储库中创建一个搜索方法,以供RestController使用。

RestController中的方法声明如下所示:

@GetMapping("/search")
public Wine searchProduct(
        @RequestParam Optional<String> searchTerm,
        @RequestParam Optional<Origin> origin) {
    // ???
}

我现在要做的是:为数据库创建一个查询,如果给出了searchTerm,就使用该数据库,与Origin相同。并且应该是可分页的。示例:

SELECT * FROM wines JOIN origins ON wines.origin_id = origins.id 
    WHERE (name LIKE $searchTerm OR description LIKE $searchTerm) AND (/*origin check*/)

page FindWinesByNameLikeOrDescriptionLikeandOrigineEquals(...,Pageable Pageable);

  • 这(除了超级丑,特别是对于更多属性)很可能不起作用,因为:
    1. 未定义“或”或“和”是否更重要(无括号)。
    2. 不知道是否可以将“起源”对象插入其中使其工作。
    3. 如果是自定义方法,不知道分页是否有效。

使用spring.io建议的“specifications and queryDSL”。

    null

共有1个答案

申屠英韶
2023-03-14

如果您发现很难理解规范,只有这两个搜索参数,并且假设win实体具有@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));
 类似资料:
  • QueryDSL定义了一个接口,通过调用或可以轻松地为任何字段获取该接口的实例。Spring Data JPA的接口甚至有一个方法,它将作为参数。 但是对QueryDSL一无所知,它有自己定义查询排序顺序的方法,即。它可以包含许多,它们与非常相似,只是它们不是类型安全的。 所以,如果我想做使用排序的分页查询,真的没有办法使用QueryDSL来定义它吗?

  • 我有一个简单的查询如下“select * from USERS”。我还使用Pageable来启用分页。 此查询可能具有基于给定参数是否为 null 的可选谓词。 例如,如果给定了“code”参数且该参数不为空,则查询变为“select * from USERS where code =:code”; 据我所知,我不能使用@Query注释来实现这一点。我可以实现一个定制的存储库,并使用EntityM

  • 在我的情况下,我有一个审查实体,它由审查状态和提交日期组成。 我正在尝试使用JpaRepository,但我不确定如何使用它来支持以下搜索查询。 我可以看到(参考http://docs.spring.io/spring-data/jpa/docs/1.4.3.release/reference/html/jpa.repositories.html),我们可以为特定的查询定义方法,比如FindByN

  • 我有两个多对多映射的类:用户和主题。我想做的是得到所有的主题谁有提供的用户。有时(这是我最奇怪的部分)它会给我带来这样的错误: com.mysql.jdbc.exceptions.jdbc4.mysqlsyntaxerrorexception:您的SQL语法中有一个错误;请查看与您的MySQL服务器版本相对应的手册,以便在第1行'))'附近使用正确的语法 返回的查询是: 我在这里漏掉了什么?完整的

  • 由于JPA不接受JOIN中的子查询,我们必须以nativeQuery的形式进行,但是这样做时,我们在分页方面遇到了问题,因为JPA没有将其与本地查询结合起来。https://docs.spring.io/spring-data/jpa/docs/1.8.0.m1/reference/html/ 本机查询@query注释允许通过将nativeQuery标志设置为true来执行本机查询。请注意,我们目

  • Spring官方JPA规范文档 我对非常陌生,所以任何指导都很有价值。