我做了一个简单的名字数据库。只有三个名字: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大小写不敏感