使用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);
}
}
答案 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));