【问题标题】:Spring data Specification match/ filter cast numeric column弹簧数据规范匹配/过滤器转换数字列
【发布时间】:2021-04-25 03:46:57
【问题描述】:

我正在使用 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)] 

【问题讨论】:

  • 您可以使用 Criteria API 调用 SQL 函数。这个问题包含一个例子stackoverflow.com/questions/5820415/… 还要注意Spring Data JPAs Specification使用JPAs Criteria API,所以这就是你需要搜索的。

标签: java hibernate jpa spring-data-jpa criteria-api


【解决方案1】:

javax.persistence.criteria.Expression.asmethond 变魔术了 您可以转换为任何数据类型

predicates.add(builder.or(
builder.like(root.get(columnName).as(String.class), "%" + filterValue + "%")));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 2020-12-21
    • 1970-01-01
    • 2020-09-16
    相关资源
    最近更新 更多