#java #oracle #hibernate #jakarta-ee #criteria
#java #Oracle #переход в спящий режим #джакарта-ee #критерии
Вопрос:
В Oracle у меня есть даты в формате
17-Апрель-2011 19:20:23.707000000
Я хотел бы получить все заказы за 17-04-2011.
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-YYYY");
String myDate = "17-04-2011";
Date date = formatter.parse(myDate);
Criteria criteria =
session.createCriteria(Order.class);
Criterion restrictDate = Restrictions.like("orderDate",date);
но это приносит мне пустой результат:
Ответ №1:
Почему вы используете Restrictions.like(...
)?
Вы должны использовать Restrictions.eq(...)
.
Обратите внимание, что вы также можете использовать .le
, .lt
.ge
, .gt
для объектов даты в качестве операторов сравнения. LIKE
оператор не подходит для этого случая, поскольку LIKE
он полезен, когда вы хотите сопоставить результаты в соответствии с частичным содержимым столбца. Пожалуйста, смотрите http://www.sql-tutorial.net/SQL-LIKE.asp для справки.
Например, если у вас есть столбец name с полным именем некоторых людей, вы можете сделать where name like 'robert %'
так, чтобы возвращать все записи с именем, начинающимся на 'robert '
( %
можно заменить любой символ).
В вашем случае вам известно полное содержимое даты, которую вы пытаетесь сопоставить, поэтому вам следует использовать не LIKE
, а равенство. Я предполагаю, что гибернация не дает вам никаких исключений в этом случае, но в любом случае у вас, вероятно, возникнет та же проблема с Restrictions.eq(...)
.
Ваш объект date, который вы получили вместе с кодом:
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-YYYY");
String myDate = "17-04-2011";
Date date = formatter.parse(myDate);
Этот объект date равен 17-04-2011 в 0 часов, 0 минут, 0 секунд и 0 наносекунд.
Это означает, что ваши записи в базе данных должны иметь точно указанную дату. Я имею в виду, что если ваша запись в базе данных имеет дату «17 апреля 2011 19:20: 23.707000000», то она не будет извлечена, потому что вы просто запрашиваете эту дату: «17 апреля 2011 00:00:00.0000000000».
Если вы хотите получить все записи вашей базы данных за определенный день, вам придется использовать следующий код:
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-YYYY");
String myDate = "17-04-2011";
// Create date 17-04-2011 - 00h00
Date minDate = formatter.parse(myDate);
// Create date 18-04-2011 - 00h00
// -> We take the 1st date and add it 1 day in millisecond thanks to a useful and not so known class
Date maxDate = new Date(minDate.getTime() TimeUnit.DAYS.toMillis(1));
Conjunction and = Restrictions.conjunction();
// The order date must be >= 17-04-2011 - 00h00
and.add( Restrictions.ge("orderDate", minDate) );
// And the order date must be < 18-04-2011 - 00h00
and.add( Restrictions.lt("orderDate", maxDate) );
Комментарии:
1. Обратите внимание, что важно понимать, что при анализе даты может быть важно подумать о часовом поясе, в котором вы хотите проанализировать / отформатировать дату Java
Ответ №2:
Используя этот способ, вы можете получить список выбранных записей.
GregorianCalendar gregorianCalendar = new GregorianCalendar();
Criteria cri = session.createCriteria(ProjectActivities.class);
cri.add(Restrictions.ge("EffectiveFrom", gregorianCalendar.getTime()));
List list = cri.list();
Все записи будут сгенерированы в список, который больше или равен ’08-Oct-2012′, или же передадут дату принятия пользователем во 2-м параметре ограничений ( gregorianCalendar.getTime()
) критериев для получения записей.
Ответ №3:
Если столбец представляет собой временную метку, вы можете выполнить следующее:
if(fromDate!=null){
criteria.add(Restrictions.sqlRestriction("TRUNC(COLUMN) >= TO_DATE('" dataFrom "','dd/mm/yyyy')"));
}
if(toDate!=null){
criteria.add(Restrictions.sqlRestriction("TRUNC(COLUMN) <= TO_DATE('" dataTo "','dd/mm/yyyy')"));
}
resultDB = criteria.list();
Ответ №4:
попробуйте это,
String dateStr = "17-April-2011 19:20:23.707000000 ";
Date dateForm = new SimpleDateFormat("dd-MMMM-yyyy HH:mm:ss").parse(dateStr);
SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
String newDate = format.format(dateForm);
Calendar today = Calendar.getInstance();
Date fromDate = format.parse(newDate);
today.setTime(fromDate);
today.add(Calendar.DAY_OF_YEAR, 1);
Date toDate= new SimpleDateFormat("dd-MM-yyyy").parse(format.format(today.getTime()));
Criteria crit = sessionFactory.getCurrentSession().createCriteria(Model.class);
crit.add(Restrictions.ge("dateFieldName", fromDate));
crit.add(Restrictions.le("dateFieldName", toDate));
return crit.list();