簡體   English   中英

Spring Boot:如何在 MySQL 數據庫中通過區分大小寫的參數查找名稱

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM