Примеры критериев гибернации
Hibernate Criteria API - это более объектно-ориентированная и элегантная альтернатива Hibernate Query Language (HQL). Это всегда хорошее решение для приложения, которое имеет множество дополнительных критериев поиска.
Пример по HQL и критериям
Вот пример из практики для получения спискаStockDailyRecord с дополнительными критериями поиска - дата начала, дата окончания и объем, порядок по дате.
1. Пример HQL
В HQL вам необходимо сравнить, является ли это первым критерием, добавляющим синтаксис «где», и отформатировать дату в подходящий формат. Это работает, но длинные коды уродливы, громоздки и подвержены ошибкам, конкатенация строк может вызвать проблемы безопасности, такие как SQL-инъекция.
public static List getStockDailtRecord(Date startDate,Date endDate, Long volume,Session session){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); boolean isFirst = true; StringBuilder query = new StringBuilder("from StockDailyRecord "); if(startDate!=null){ if(isFirst){ query.append(" where date >= '" + sdf.format(startDate) + "'"); }else{ query.append(" and date >= '" + sdf.format(startDate) + "'"); } isFirst = false; } if(endDate!=null){ if(isFirst){ query.append(" where date <= '" + sdf.format(endDate) + "'"); }else{ query.append(" and date <= '" + sdf.format(endDate) + "'"); } isFirst = false; } if(volume!=null){ if(isFirst){ query.append(" where volume >= " + volume); }else{ query.append(" and volume >= " + volume); } isFirst = false; } query.append(" order by date"); Query result = session.createQuery(query.toString()); return result.list(); }
2. Пример критерия
В Критериях вам не нужно сравнивать, является ли это первым критерием для добавления синтаксиса «где», или форматировать дату. Строка кода сокращена, и все обрабатывается более элегантно и объектно-ориентированным способом.
public static List getStockDailyRecordCriteria(Date startDate,Date endDate, Long volume,Session session){ Criteria criteria = session.createCriteria(StockDailyRecord.class); if(startDate!=null){ criteria.add(Expression.ge("date",startDate)); } if(endDate!=null){ criteria.add(Expression.le("date",endDate)); } if(volume!=null){ criteria.add(Expression.ge("volume",volume)); } criteria.addOrder(Order.asc("date")); return criteria.list(); }
Критерии API
Давайте рассмотрим некоторые популярные функции API Criteria.
1. Критерии базового запроса
Создайте объект критерия и извлеките все записи «StockDailyRecord» из базы данных.
Criteria criteria = session.createCriteria(StockDailyRecord.class);
2. Критерий заказа запроса
Результат сортируется по «дате» в порядке возрастания.
Criteria criteria = session.createCriteria(StockDailyRecord.class) .addOrder( Order.asc("date") );
Результат сортируется по дате в порядке убывания.
Criteria criteria = session.createCriteria(StockDailyRecord.class) .addOrder( Order.desc("date") );
3. Критерий ограничения запроса
Класс Restrictions предоставляет много методов для выполнения операции сравнения.
Restrictions.eq
Убедитесь, что значение равно 10000.
Criteria criteria = session.createCriteria(StockDailyRecord.class) .add(Restrictions.eq("volume", 10000));
Restrictions.lt, le, gt, ge
Убедитесь, что громкость составляет менее 10000.
Criteria criteria = session.createCriteria(StockDailyRecord.class) .add(Restrictions.lt("volume", 10000));
Убедитесь, что громкость меньше или равна 10000.
Criteria criteria = session.createCriteria(StockDailyRecord.class) .add(Restrictions.le("volume", 10000));
Убедитесь, что громкость превышает 10000.
Criteria criteria = session.createCriteria(StockDailyRecord.class) .add(Restrictions.gt("volume", 10000));
Убедитесь, что громкость больше или равна 10000.
Criteria criteria = session.createCriteria(StockDailyRecord.class) .add(Restrictions.ge("volume", 10000));
Restrictions.like
Убедитесь, что название акции начинается с «MKYONG» и сопровождается любыми символами.
Criteria criteria = session.createCriteria(StockDailyRecord.class) .add(Restrictions.like("stockName", "MKYONG%"));
Restrictions.between
Убедитесь, что дата находится между начальной и конечной датой.
Criteria criteria = session.createCriteria(StockDailyRecord.class) .add(Restrictions.between("date", startDate, endDate));
Restrictions.isNull, isNotNull
Убедитесь, что громкость равна нулю.
Criteria criteria = session.createCriteria(StockDailyRecord.class) .add(Restrictions.isNull("volume"));
Убедитесь, что громкость не нулевая.
Criteria criteria = session.createCriteria(StockDailyRecord.class) .add(Restrictions.isNotNull("volume"));
Многие другие функции ограничений можно найти здесь.
https://www.hibernate.org/hib_docs/v3/api/org/hibernate/criterion/Restrictions.html
3. Критерии подкачки результата
Критерии предоставляют несколько функций, чтобы сделать нумерацию страниц чрезвычайно простой Начиная с 20-й записи и извлеките следующие 10 записей из базы данных.
Criteria criteria = session.createCriteria(StockDailyRecord.class); criteria.setMaxResults(10); criteria.setFirstResult(20);
Почему не Критерии!?
API Criteria действительно имеет некоторые недостатки.
1. Проблема производительности
У вас нет возможности контролировать SQL-запрос, сгенерированный Hibernate, если сгенерированный запрос медленный, вам очень сложно настроить запрос, и администратору базы данных это может не понравиться.
1. Вопрос об обслуживании
Все SQL-запросы разбросаны по Java-коду. Если запрос пошел не так, вы можете потратить время на поиск проблемного запроса в вашем приложении. С другой стороны, именованные запросы, хранящиеся в файлах отображения Hibernate, гораздо проще поддерживать.
Заключение
Ничто не идеально, учитывайте потребности вашего проекта и используйте его с умом.