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") --> true
existsByClientId("ABC") --> true
预期结果:existsByClientId("abc") --> false
existsByClientId("ABC") --> 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中不区分大小写,如何使其区分大小写的主要内容,如果未能解决你的问题,请参考以下文章