Spring 数据规范匹配/过滤器转换数字列

问题描述

我使用 Spring Datas Specification 来实现数据过滤。我是 Spring Datas Specification 的新手,仍在努力了解它的工作原理。

我遇到了两个用例:

  1. 在匹配模式下过滤数字列包含。
  2. 在匹配模式包含的数字列上过滤。

是否可以将数据列转换为字符串,然后使用 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 + "%")));