SpringData JPA "AND"和"OR"查询未按预期工作



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

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中的所有示例但是所有这些例子都非常简单(大多数查询甚至只有一个简单的条件)。

所有我读过这个答案如何通过方法名组合多个And和Or,我同意它。但是,正如你所看到的,我不认为我的场景像OP那样复杂。只是"这样;和";OR"查询条件的组合,这是很容易在SQL的方式,但我只是想让它通过JPA的方式。

我不认为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查看更多示例/解释

最新更新