【问题标题】:Spring data JPA existsByField is case insensitive in MySQL, how to make it case sensitiveSpring数据JPAexistsByField在MySQL中不区分大小写,如何使其区分大小写
【发布时间】: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; true
existsByClientId("ABC") --&gt; true

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

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

【问题讨论】:

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

标签: java mysql spring jpa spring-data-jpa


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2012-12-01
    • 2020-02-18
    • 2020-08-02
    • 2014-07-19
    • 2011-08-10
    相关资源
    最近更新 更多