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



我做了一个简单的名字数据库。只有三个名字:Adm,Arnold and Ma锡。我想要得到所有包含字母& & &;的名字.我在我的仓库中有这个方法:Let String letter = "a";

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

它返回所有名字(名字列表),因为查找一些"a"或";A"在所有的名字里。但我只想找到包含的名称完全小写的.这个查询在workbench中工作得很好:SELECT * FROM person WHERE name LIKE BINARY '%a%';但是这段代码返回空(null) List。

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

我不知道如何将变量字母链接到查询。谢谢你的建议。PS:如何使sqlinject保护在这种情况下,如果变量字母被包裹在"%">

?

With

@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索引是否区分大小写?

BINARY改为lower。它指定你想要一个小写的

@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);

Doc: JPQL Like大小写不敏感

最新更新