【问题标题】:SpringData JPA "AND" and "OR" query not working as expectedSpring Data JPA“AND”和“OR”查询未按预期工作
【发布时间】:2021-12-03 13:16:32
【问题描述】:

保持简单,我想构建一个查询以使其等效于:

select * from user where (name like ? or detail like ?) and age = ?

到目前为止我所尝试的:

Page<Post> findByNameOrDetailContainingAndAgeEquals(String query, int age, Pageable pageable);

Page<Post> findByNameContainingOrDetailContainingAndAgeEquals(String query, String query, int age, Pageable pageable);

所有这些方法都失败了。看来Spring拆分查询非常错误。

我已经检查了https://github.com/spring-projects/spring-data-jpa/blob/main/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java 中的所有示例 但所有这些示例都非常简单(大多数查询即使只有一个简单条件)。

我已阅读此答案How to combine multiple And and Or through method name 并同意。但是,如您所见,我认为我的情况并不像 OP 那样复杂。只需将“AND”和“OR”查询条件结合起来,这在 SQL 方式中很容易,但我只想通过 JPA 方式来实现。

【问题讨论】:

    标签: java spring jpa spring-data-jpa spring-data


    【解决方案1】:

    我认为 JPA 无法使用开箱即用的命名查询来处理这些带有括号的复杂条件。此外,您正在使用 like 子句,命名查询无法处理(这些仅用于相等)。

    你最好的镜头可能是使用类似的东西

    @Query("SELECT u FROM User u WHERE (u.name like : name or u.detail like : detail) and u.age = :age"
    Collection<User> findUsersByNameDetailAndAge(String name, String detail, int age);
    

    如果这不起作用,您将不得不在此处使用本机查询。

    查看此处https://www.baeldung.com/spring-data-jpa-query 了解更多示例/说明

    【讨论】:

    • 实际上在我的情况下,namedetail 的查询条件接受相同的参数。在本机 SQL 中,括号甚至可以被删除,这不会使其模棱两可。但是如果在子句中同时输入“AND”和“OR”,JPA 似乎无法处理。
    • 要使namedetail 具有相同的值,您只需在调用客户端中传递相同的值,例如findUsersByNameDetailAndAge("peter", "peter", 36);,但您使用与我建议的相同的查询签名更多。或者,您可以将查询修改为 @Query("SELECT u FROM User u WHERE (u.name like :search or u.detail like : search) and u.age = :age" 并具有以下签名:Collection&lt;User&gt; findUsersByNameDetailAndAge(String search, int age);
    猜你喜欢
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 2016-06-18
    • 2015-09-05
    相关资源
    最近更新 更多