Примеры критериев гибернации

Примеры критериев гибернации

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, гораздо проще поддерживать.

Заключение

Ничто не идеально, учитывайте потребности вашего проекта и используйте его с умом.