如何解决如何使用条件查询基于日期获取数据?
我正在使用条件查询,并希望根据日期获取数据。但是,条件之类的条件查询不适用于日期。
我从用户那里获得了2020-08-25
之类的日期。
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<FermBatch> cq = cb.createQuery(MyClass.class);
Root<MyClass> root = cq.from(MyClass.class);
cq.where(cb.like(root.get(MyClass_.date),date+"%"));
return em.createQuery(cq).getResultList();
在这种情况下,显示错误:
类型中的方法(Expression,String) CriteriaBuilder不适用于参数(路径, 字符串)
在我的数据库中,日期存储为2020-08-25 03:02:06
如何根据经过的日期获取所有数据(仅使用日期,时间无关紧要)。
我还尝试了其他stackoverflow问题link的解决方案:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<MyClass> cq = cb.createQuery(MyClass.class);
Root<MyClass> entity = cq.from(MyClass.class);
cq.select(entity);
List<Predicate> predicates = new ArrayList<Predicate>();
predicates.add(cb.like(cb.lower(entity.get(MyClass_.date).as(String.class)),"%"+date.toLowerCase()+"%"));
Path<Tuple> tuple = entity.<Tuple>get("date");
if(tuple.getJavaType().isAssignableFrom(Date.class)){
Expression<String> dateStringExpr = cb.function("DATE_FORMAT",String.class,entity.get("date"),cb.literal("'%d/%m/%Y %r'"));
predicates.add(cb.like(cb.lower(dateStringExpr),"%"+date.toLowerCase()+"%"));
}
cq.where(predicates.toArray(new Predicate[]{}));
TypedQuery<MyClass> query = em.createQuery(cq);
return query.getResultList();
这将返回一个空的arraylist。那我在做什么错了?
解决方法
我建议以毫秒为单位传递“数据”;总是更容易。
无论如何,您不应在DATE使用“ like”运算符;您应该使用等于,小于或大于。
long millis = 1598359174854l; // Tue Aug 25 2020 12:39:34
Predicate pred = criteriaBuilder.greaterThanOrEqualTo(
root.get(MyClass_.date),new Date(millis);
如果有字符串,则应首先将字符串转换为DATE,然后进行比较:
String date = "2020-08-25";
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
Date cal = dateFormat.parse(date);
,
此代码对我有用
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<MyClass> query = builder.createQuery(MyClass.class);
Root<MyClass> root = query.from(MyClass.class);
Predicate predicate = builder.conjunction();
predicate = builder.like(root.get(MyClass_.date).as(String.class),"%"+date+"%");
query.where(predicate).select(root);;
return em.createQuery(query).getResultList();
谢谢大家。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。