Spring数据JPAexistsByField在MySQL中不区分大小写,如何使其区分大小写

Posted

技术标签:

【中文标题】Spring数据JPAexistsByField在MySQL中不区分大小写,如何使其区分大小写【英文标题】:Spring data JPA existsByField is case insensitive in MySQL, how to make it case sensitive 【发布时间】:2020-04-08 13:27:38 【问题描述】:

ClientsRepository 类

public interface ClientsRepository extends JpaRepository<ClientsEntity, Long> 

    boolean existsByClientId(String clientId);


ClientsEntity 类

@Getter
@Setter
@NoArgsConstructor
@Entity
@Table(name = "clients")
public class ClientsEntity 

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private String clientId;


客户表| id | client_id | |---------------------|------------------| | 1 | ABC | |---------------------|------------------|

调用existsByClientId("abc")时返回true,如何强制检查大小写?

实际结果:existsByClientId("abc") --&gt; trueexistsByClientId("ABC") --&gt; true

预期结果:existsByClientId("abc") --&gt; falseexistsByClientId("ABC") --&gt; true

Java 版本 8 Spring Boot 版本 2.1.2.RELEASE mysql-connector-java 版本 5.1.46

【问题讨论】:

如果内容属实,请查看this。 @samabcde 我已经添加了实际结果,请看一下,并编辑我的问题。 请按照 ostrokach 的回答检查排序规则(链接在我之前的评论中)。我想不区分大小写的问题是由于数据库而不是程序造成的。 @samabcde 好的,谢谢。 【参考方案1】:

默认情况下,派生的 SQL 查询区分大小写。但是,正如document中所说的

方法解析器支持为单个属性(例如 findByLastnameIgnoreCase(…))或支持忽略大小写的类型的所有属性(通常是 String 实例 — 例如 findByLastnameAndFirstnameAllIgnoreCase(…))设置 IgnoreCase 标志。 是否支持忽略大小写可能因商店而异,因此请参阅参考文档中的相关部分了解商店特定的查询方法

由于我们使用的是 MySQL 数据库,区分大小写取决于服务器、数据库和连接排序规则,而 default collation(utf8mb4_0900_ai_ci) 不区分大小写,使得比较不区分大小写。与其他数据库比较时产生意外结果。

从MySQL case insensitive select 的解决方案来看,将列排序规则更改为区分大小写是最简单的,无需更改代码。

【讨论】:

以上是关于Spring数据JPAexistsByField在MySQL中不区分大小写,如何使其区分大小写的主要内容,如果未能解决你的问题,请参考以下文章

Spring 如何在 Spring Boot 中设置数据源

spring的数据库操作问题

spring(16)------spring的数据源配置

Spring 管理数据源

在spring boot中使用JDBC和spring data jpa为我的会话spring创建单独的数据源

Spring学习11-Spring管理各种数据源