1

我想根据日期字段选择条件查询的一些记录:

CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery();
Root<Macchinario> from = cq.from(Macchinario.class);
cq.select(from);

cq.where(
                    cb.and(
                        cb.like(from.<String>get("marca"), "%"+ricerca.getMarca()+"%"),
                        cb.like(from.<String>get("modello"), "%"+ricerca.getModello()+"%"),
                        cb.like(from.<String>get("matricola"), "%"+ricerca.getMatricola()+"%"),

                        cb.equal(from.get("dataInserimento"), ricerca.getDataInserimento())
                    )
                );

dataInserimento 是一个 java.util.Date

我正在寻找的“Macchinario”在数据库中有“2012-05-23 10:16:00”。

ricerca.getDataInserimento() 返回“2012-05-23 00:00:00”。

如何传递该参数,告诉 jpa 忽略日期的“时间部分”?

4

2 回答 2

6

您可以编写一个实用程序并使用它来截断日期中的时间部分:

DateHelper.java

public static Date getDateWithoutTime(Date date) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    return cal.getTime();
}

然后改变

cb.equal(from.get("dataInserimento"), ricerca.getDataInserimento())

cb.equal(from.get("dataInserimento"), 
         DateHelper.getDateWithoutTime(ricerca.getDataInserimento()))

更新

从我们从 db 获得的值中截断时间部分似乎不可能使用 JPA 或 Hibernate 提供的开箱即用功能。Hibernate 提供了从日期列中提取年、月和日值的功能,我们将使用它。

Calendar dateCalendar = Calendar.getInstance();
dateCalendar.setTime(ricerca.getDataInserimento());

Path<Date> dataInserimento = from.get("dataInserimento");
Predicate timelessPredicate = cb.and(
        cb.equal(cb.function("year", Integer.class, dataInserimento), dateCalendar.get(Calendar.YEAR)),
        cb.equal(cb.function("month", Integer.class, dataInserimento), dateCalendar.get(Calendar.MONTH) + 1),
        cb.equal(cb.function("day", Integer.class, dataInserimento), dateCalendar.get(Calendar.DATE)));

cq.where(..., timelessPredicate);

我们在这里所做的是,借助休眠功能和日历功能,我们将数据库中的年、月和日值与提供的输入日期分别进行比较。

这会成功的。

于 2012-05-24T08:55:39.757 回答
0

您可以尝试使用适当的模式格式化日期以忽略时间部分。

public String getDate(java.util.Date date){

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    return sdf.format(date);
}

现在,您可以将日期作为正确格式的字符串,然后比较它们是否相等。

cb.equal(getDate(from.<java.util.Date>get("dataInserimento")), getDate(ricerca.getDataInserimento()))
于 2012-05-24T18:47:15.373 回答