保持簡單我想構建一個查詢以使其等效于:
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 那樣復雜。只需將“AND”和“OR”查詢條件組合起來,這在 SQL 方式中很容易,但我只想通過 JPA 方式實作。
uj5u.com熱心網友回復:
我不認為 JPA 可以使用開箱即用的命名查詢來處理這些帶有括號的復雜條件。此外,您正在使用like名為 quieries 不處理的子句(這些僅用于相等)。
你最好的鏡頭可能是使用類似的東西
@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以獲取更多示例/說明
uj5u.com熱心網友回復:
所有這些方法都失敗了。似乎Spring拆分查詢非常錯誤。
你說的“分裂”是什么意思?Spring 僅通過以下簡單規則生成此查詢:
select * from user where name = ? or detail = ? and age = ?
這正是您的方法名稱所述的內容。但與您的本機查詢不同。
a or b and c與a or (b and c)但不相同(a or b) and c
將以下內容添加到您的 application.yml 中,您將看到 spring 使用的本機查詢:
logging:
level:
org.hibernate.SQL: debug
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/318569.html
上一篇:關于htmlimgsrc
下一篇:為什么我的查詢回應回傳空值?
