【发布时间】:2021-04-25 03:46:57
【问题描述】:
我正在使用 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)]
【问题讨论】:
-
您可以使用 Criteria API 调用 SQL 函数。这个问题包含一个例子stackoverflow.com/questions/5820415/… 还要注意Spring Data JPAs Specification使用JPAs Criteria API,所以这就是你需要搜索的。
标签: java hibernate jpa spring-data-jpa criteria-api