Spring 引导:如何在 MySQL 数据库中通过区分大小写的参数查找名称

Spring Boot: How to find name by a case sensitive parameter in a MySQL database

我做了一个简单的名字数据库。只有三个名字:Adam,Arnold 和 Matin。我想获取所有包含字母 "a" 的名称。 我在我的存储库中有这个方法: 让字符串字母 = "a";

@Query(value = "SELECT * FROM person WHERE name LIKE %:letter%", nativeQuery = true)
    List<PersonEntity> findByNameLike( @Param("letter") String letter);

它returns所有名字(名字列表),因为它找到一些"a " 或 "A" 所有名称。但我只想找到包含 完全小写的“a” 的名称。 此查询在 Workbech 中运行良好: SELECT * FROM person WHERE name LIKE BINARY '%a%'; 但是这段代码 returns empty(null) List.

@Query(value = "SELECT * FROM person WHERE   name  LIKE BINARY '%:letter%'", nativeQuery = true)
    List<PersonEntity> findByNameLike( @Param("letter") String letter);

我不知道如何link查询变量字母。谢谢你的任何想法。 PS:How 如果变量字母包含在“%”中,在这种情况下进行 SQL 注入保护?

BINARY 更改为 lower。它指定您想要 lower-case.

@Query(value = "SELECT * FROM person WHERE name LIKE lower '%:letter%'", nativeQuery = true)
    List<PersonEntity> findByNameLike( @Param("letter") String letter);

作为提示,我不会使用 'jpql',如果您可以利用 spring-data,并且您不必编写查询:

List<PersonEntity> findByLetterContaining(String letter);

文档:

@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-injection。

通过使用您决定 table 创建的正确排序规则,无论查询区分大小写还是不区分大小写,请参阅 Are UNIQUE indices case sensitive in MySQL?