使用通配符使用CriteriaQueries搜索日期和长度

时间:2018-03-27 21:50:39

标签: java sql-server spring hibernate criteriaquery

我一直在围绕着这个问题,但仍然无法找到解决方案。 我有一个表,带有搜索输入。我的客户希望主要使用此输入来搜索日期和长类型字段。所以基本上我一直在尝试使用like来制作条件查询,以便将Date与带有通配符的字符串相匹配。

由于多种原因,我无法使用HQL或其他类型的“手动”查询。我只限于CriteriaQueries。

到目前为止,这是我最大的努力:

public Predicate toPredicate(Root<Absence> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
        List<Predicate> predicates = new ArrayList<>();

        if (filter != null) {

            List<Predicate> or = new ArrayList<>();

            if (filter.getFilter() != null && !filter.getFilter().isEmpty()) {
                Expression<String> function= cb.function("CONVERT", String.class, cb.literal(String.class), root.get(Absence_.pk).get(AbsenceID_.fecha), cb.literal(3));

                or.add(cb.like(function, getLikeAnywhere(filter.getFilter())));
                or.add(cb.like(root.get(Absence_.apellidoYNombre), getLikeAnywhere(filter.getFilter())));
                or.add(cb.like(root.get(Absence_.pk).get(AbsenceID_.tipo), getLikeAnywhere(filter.getFilter())));
                or.add(cb.like(root.get(Absence_.causa), getLikeAnywhere(filter.getFilter())));
            }

            if (or.size() > 0) {
                predicates.add(cb.or(or.toArray(new Predicate[or.size()])));
            }

        }

        return cb.and(predicates.toArray(new Predicate[predicates.size()]));
    }

getLikeAnywhere方法只获取一个字符串,并在其开头和结尾添加“%”。

我试图实现的功能是尽最大努力在CriteriaQuery中获得CONVERT(varchar,date_field,3)。

然而,它失败了,休眠调试模式显示下一个:

query +  where CONVERT(?, fecha, 3) like ? + more_query
 Incorrect syntax near '@P1'.

几乎工作,除了我得到的第一个参数?我尝试在函数中以各种时尚方式添加更多参数,但没有结果。我还没有找到一种方法将sql varchar类型作为参数传递给它。

有人想出这个吗?或者使用另一种功能解决它?

提前致谢,

的Gonzalo。

0 个答案:

没有答案