Java JPA-带in子句的Specificaton,不区分大小写

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

使用mysql和springboot jpa

我试图使用JPA实现in子句。当参数列表传递给规范时,在编写manaul查询时获得预期结果,如下所示。 employeeId是一个字符串列,包含大写和小写字母。 虽然手动查询有效,但必须实现一个规范

手动查询:

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”));
}

Do
SHOW CREATE TABLE employeeentity
--您可能会发现
排序规则是
…bin
而不是
…ci
(对于“不区分大小写”)

您是否使用IgnoreCase尝试过该查询?您好,谢谢您的回答,employeeIdParamsList.replaceAll(String::toUpperCase);criteriaBuilder.upper(root.get(“employeeId”)).in(employeeIdParamsList);并尝试用较低的也仍然无法检索记录。通过手动查询,我注意到列表中检索的参数是小写字母,表列值是大小写混合字母。您是否尝试修改hibernate配置以打印生成的查询?