如何使用条件查询基于日期获取数据?

问题描述

我正在使用条件查询,并希望根据日期获取数据。但是,条件之类的条件查询不适用于日期。

我从用户那里获得了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();

谢谢大家。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...