问题描述
我使用 Spring Datas Specification
来实现数据过滤。我是 Spring Datas Specification
的新手,仍在努力了解它的工作原理。
我遇到了两个用例:
- 在匹配模式下过滤数字列包含。
- 在匹配模式包含的数字列上过滤。
是否可以将数据列转换为字符串,然后使用 like 运算符?
类似于 SELECT * FROM MyTable WHERE CAST(phone AS VARCHAR(9)) LIKE '%0203'
或者我可以使用其他一些 Spring Data 魔法吗?
public Predicate toPredicate(
final Root<Model> root,final CriteriaQuery<?> query,final CriteriaBuilder builder)
{
final List<Predicate> predicates = new ArrayList<>();
final Map<String,FilterMeta> map = filters.getFilterBy();
for (final Entry<String,FilterMeta> entry : map.entrySet())
{
if (!ignoreList.contains(entry.getKey()))
{
final Class<?> fieldType =
ReflectionUtils.findField(Model.class,entry.getKey()).getType();
if (fieldType.equals(LocalDateTime.class))
{
//how to query LocalDateTime countains mode
}
if (fieldType.equals(int.class))
{
//how to query int with countains mode
predicates.add(builder.like(root.get(entry.getKey()),"%" + entry.getValue().getValue() + "%"));
}
if (fieldType.equals(String.class))
{
predicates.add(builder.like(root.get(entry.getKey()),"%" + entry.getValue().getValue() + "%"));
}
}
}
return builder.or(predicates.toArray(new Predicate[0]));
}
使用上述规范时出现以下异常。
java.lang.IllegalArgumentException: Parameter value [%0%] did not match expected type [java.lang.Integer (n/a)]
解决方法
javax.persistence.criteria.Expression.as
方法发挥了神奇作用
您可以转换为任何数据类型
predicates.add(builder.or(
builder.like(root.get(columnName).as(String.class),"%" + filterValue + "%")));