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-2310:16:00」があります。

ricerca.getDataInserimento()は「2012-05-2300:00:00」を返します。

日付の「時間部分」を無視するようにjpaに指示して、そのパラメーターを渡すにはどうすればよいですか?

4

2 に答える 2

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);

ここで行ったことは、データベースの年、月、日の値を、休止状態の機能とカレンダーの機能を使用して、入力日を個別に提供して比較したことです。

これでうまくいきます。

于 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 に答える