我想根据日期字段选择条件查询的一些记录:
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”在db中有“2012-05-23 10:16:00”。
ricerca.getDataInserimento()返回“2012-05-23 00:00:00”。
如何传递该参数,告诉jpa忽略Date的“时间部分”?
答案 0 :(得分:6)
<击> 您可以编写一个util并使用它来截断日期中的时间部分:
<强> 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);
我们在这里做了什么,我们将数据库中的年,月,日值与提供的输入日期进行了比较,分别借助于休眠功能和日历功能。
这样就可以了。
答案 1 :(得分:0)
您可以尝试使用适当的模式格式化日期以忽略时间部分。
public String getDate(java.util.Date date){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(date);
}
现在,您可以将日期作为正确格式的字符串&amp;然后比较它们是否相等。
cb.equal(getDate(from.<java.util.Date>get("dataInserimento")), getDate(ricerca.getDataInserimento()))