Java JPA-带in子句的Specificaton,不区分大小写
使用mysql和springboot jpa 我试图使用JPA实现in子句。当参数列表传递给规范时,在编写manaul查询时获得预期结果,如下所示。 employeeId是一个字符串列,包含大写和小写字母。 虽然手动查询有效,但必须实现一个规范 手动查询:Java JPA-带in子句的Specificaton,不区分大小写,java,mysql,spring-boot,jpa,spring-data-jpa,Java,Mysql,Spring Boot,Jpa,Spring Data Jpa,使用mysql和springboot jpa 我试图使用JPA实现in子句。当参数列表传递给规范时,在编写manaul查询时获得预期结果,如下所示。 employeeId是一个字符串列,包含大写和小写字母。 虽然手动查询有效,但必须实现一个规范 手动查询: SELECT emp FROM EmployeeEntitiy emp WHERE LOWER(emp.employeeIdParam) IN( SELECT LOWER(empRel.destinationssid) FROM Em
SELECT emp
FROM EmployeeEntitiy emp
WHERE LOWER(emp.employeeIdParam) IN(
SELECT LOWER(empRel.destinationssid)
FROM EmployeeRelationEntity empRel WHERE ((LOWER(empRel.employeeId)=:employeeIdParam
OR UPPER(empRel.employeeId)=:employeeIdParam)
OR empRel.employeeId=:employeeIdParam)
如何像在toPredicateoverride方法中手动查询一样检查大写和小写的列数据。
JPA规范:
private class ParentChildCISpecification implements Specification<EmployeeEntitiy> {
List<String> employeeIdParamsList = new ArrayList<String>();
public ParentChildCISpecification(List<String> employeeIdParamsList) {
this.employeeIdParamsList = employeeIdParamsList;
}
@Override
public Predicate toPredicate(Root<EmployeeEntitiy> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
return root.get("employeeId").in(employeeIdParamsList);
}
}
私有类parentChildsSpecification实现了该规范{
List employeeIdParamsList=new ArrayList();
public ParentChild指定(列表employeeIdParamsList){
this.employeeIdParamsList=employeeIdParamsList;
}
@凌驾
公共谓词toPredicate(根根、CriteriaQuery查询、CriteriaBuilder CriteriaBuilder){
在(employeeIdParamsList)中返回root.get(“employeeId”);
}
}
传入一个小写字符串列表并使用CriteriaBuilder.lower
表达式:
@Override
public Predicate toPredicate(Root<EmployeeEntitiy> root
, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
return criteriaBuilder.lower(root.get("employeeId")).in(employeeIdParamsList);
}
@覆盖
公共谓词toPredicate(根)
,CriteriaQuery查询,CriteriaBuilder(CriteriaBuilder){
在(employeeIdParamsList)中返回criteriaBuilder.lower(root.get(“employeeId”));
}
DoSHOW CREATE TABLE employeeentity
--您可能会发现排序规则是…bin
而不是…ci
(对于“不区分大小写”)您是否使用IgnoreCase尝试过该查询?您好,谢谢您的回答,employeeIdParamsList.replaceAll(String::toUpperCase);criteriaBuilder.upper(root.get(“employeeId”)).in(employeeIdParamsList);并尝试用较低的也仍然无法检索记录。通过手动查询,我注意到列表中检索的参数是小写字母,表列值是大小写混合字母。您是否尝试修改hibernate配置以打印生成的查询?