我一直在围绕着这个问题,但仍然无法找到解决方案。 我有一个表,带有搜索输入。我的客户希望主要使用此输入来搜索日期和长类型字段。所以基本上我一直在尝试使用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。