JPA-带有in子句且不区分大小写的规范

时间:2019-04-02 06:13:45

标签: 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 EmployeeRelationEntity empRel WHERE ((LOWER(empRel.employeeId)=:employeeIdParam
                                             OR UPPER(empRel.employeeId)=:employeeIdParam)
                                             OR empRel.employeeId=:employeeIdParam)

我如何像大写小写的 toPredicate 中的手动查询那样检查大写和小写的列数据。 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);

    }
}

3 个答案:

答案 0 :(得分:3)

传入小写的字符串列表,并使用CriteriaBuilder.lower表达式:

@Override
    public Predicate toPredicate(Root<EmployeeEntitiy> root
        , CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {

        return criteriaBuilder.lower(root.get("employeeId")).in(employeeIdParamsList);

    }

答案 1 :(得分:0)

执行SHOW CREATE TABLE EmployeeEntitiy-您可能会发现COLLATION...bin而不是...ci(对于“不区分大小写”)

答案 2 :(得分:0)

在相同的情况下可以使用以下

import org.springframework.data.jpa.domain.Specification;

final Specification<EmployeeEntity> spec = (employeeEntity, cq, cb) -> cb.equal(cb.lower(employeeEntity.get("email")), email.toLowerCase());
final List<EmployeeEntity> empList = employeeRepository.findAll(spec, PageRequest.of(page, size));