API критериев гибернации – это более объектно-ориентированная и элегантная альтернатива языку запросов гибернации (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 критериев.
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. Запрос ограничений критериев
Класс ограничений предоставляет множество методов для выполнения операции сравнения.
Класс ограничений предоставляет множество методов для выполнения операции сравнения.
Убедитесь, что громкость равна 10000.
Criteria criteria = session.createCriteria(StockDailyRecord.class) .add(Restrictions.eq("volume", 10000));
Restrictions.lt, ле, 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));
Убедитесь, что громкость больше или равна 10000.
Убедитесь, что название акции начинается с “MKYONG” и сопровождается любыми символами.
Criteria criteria = session.createCriteria(StockDailyRecord.class) .add(Restrictions.like("stockName", "MKYONG%"));
Убедитесь, что название акции начинается с “MKYONG” и сопровождается любыми символами.
Убедитесь, что дата находится между датой начала и датой окончания.
Criteria criteria = session.createCriteria(StockDailyRecord.class) .add(Restrictions.between("date", startDate, endDate));
Ограничения.Это не так, это не так
Убедитесь, что громкость равна нулю.
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 критериев действительно имеет некоторые недостатки.
1. Проблема с производительностью
У вас нет возможности управлять SQL-запросом, сгенерированным Hibernate, если сгенерированный запрос выполняется медленно, вам очень сложно настроить запрос, и вашему администратору базы данных это может не понравиться.
1. Проблема с обслуживанием
Все SQL-запросы разбросаны по Java-коду, когда запрос пошел не так, вы можете потратить время на поиск проблемного запроса в своем приложении. С другой стороны, именованные запросы, хранящиеся в файлах отображения гибернации, намного проще в обслуживании.
Вывод
Ничто не идеально, учитывайте потребности вашего проекта и используйте его с умом.
Оригинал: “https://mkyong.com/hibernate/hibernate-criteria-examples/”