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

时间:2019-12-16 04:34:44

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

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 | |---------------------|------------------|

当调用existByClientId(“ 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

1 个答案:

答案 0 :(得分:0)

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

中所述
  

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

由于我们正在使用MySQL数据库,因此区分大小写取决于服务器,数据库和连接排序规则,default collation(utf8mb4_0900_ai_ci)不区分大小写,从而使比较不区分大小写。与其他数据库比较时创建意外结果。

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