我正在使用条件查询,并希望根据日期获取数据。但是,条件之类的条件查询不适用于日期。
我从用户那里获得了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。那我在做什么错了?
答案 0 :(得分:0)
我建议以毫秒为单位传递“数据”;总是更容易。
无论如何,您不应在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);
答案 1 :(得分:0)
此代码对我有用
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();
谢谢大家。