[英]Spring data JPA existsByField is case insensitive in MySQL, how to make it case sensitive
[英]Spring Boot: How to find name by a case sensitive parameter in a MySQL database
我制作了簡單的名稱數據庫。 只有三個名稱: A d a m、 A rnold 和 M a tin。 我想得到所有包含字母"a" 的名字。 我在我的存儲庫中有這個方法: Let String letter = "a";
@Query(value = "SELECT * FROM person WHERE name LIKE %:letter%", nativeQuery = true)
List<PersonEntity> findByNameLike( @Param("letter") String letter);
它返回所有名稱(名稱列表) ,因為它在所有名稱中找到一些“a”或“A” 。 但我只想找到包含完全小寫 "a" 的名稱。 此查詢在 Workbech 中運行良好: SELECT * FROM person WHERE name LIKE BINARY '%a%';
但是此代碼返回空(空)列表。
@Query(value = "SELECT * FROM person WHERE name LIKE BINARY '%:letter%'", nativeQuery = true)
List<PersonEntity> findByNameLike( @Param("letter") String letter);
我不知道如何將變量字母鏈接到查詢。 謝謝你的任何想法。 PS:如果變量字母被包裹在“%”中,這種情況下如何進行SQLinjection保護?
將BINARY更改為更低。 它指定您想要一個小寫字母。
@Query(value = "SELECT * FROM person WHERE name LIKE lower '%:letter%'", nativeQuery = true)
List<PersonEntity> findByNameLike( @Param("letter") String letter);
作為提示,如果您可以利用 spring-data,並且您不必編寫查詢,我不會使用“jpql”:
List<PersonEntity> findByLetterContaining(String letter);
文檔: JPQL 類似不區分大小寫
和
@Query(value = "SELECT * FROM person WHERE name LIKE BINARY '%:letter%'", nativeQuery = true)
List<PersonEntity> findByNameLike( @Param("letter") String letter);
您正在尋找包含字符串 ':letter' 的名稱,請嘗試
@Query(value = "SELECT * FROM person WHERE name LIKE BINARY CONCAT('%',:letter,'%')", nativeQuery = true)
List<PersonEntity> findByNameLike( @Param("letter") String letter);
並且使用 Query-annotation 沒有 SQL 注入的機會。
通過使用正確的排序規則,您可以決定查詢是否區分大小寫或不區分大小寫,請參閱MySQL 中的 UNIQUE 索引是否區分大小寫?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.