Разница между критериями и отдельными критериями в гибернации?

#hibernate

#режим гибернации

Вопрос:

В чем разница между критериями и отдельными критериями? Когда мы должны использовать критерии, а когда мы должны использовать отдельные критерии?

Комментарии:

1. @Damien_The_Unbeliever у меня были такие же сомнения, я искал в Google и попал сюда … вместо ответа я сначала увидел ваш комментарий. хотелось бы, чтобы вы приложили эти усилия, чтобы написать ответ, а не такой комментарий.

Ответ №1:

Отсоединенные критерии позволяют создавать запрос без Session . Затем вы можете выполнить поиск в произвольном сеансе.

На самом деле вам следует тщательно подумать при detached criteria использовании другого или нового сеанса (без кэша и создания сеанса).

Они наиболее полезны для условий объединения, поднаборов и запросов вне текущего сеанса.

Другое распространенное использование — повторное использование кода. Многие разработчики объявляют их как static запросы и выполняют их, используя базовый сеанс из разных DAO .

Комментарии:

1. Привет, Фолл, спасибо за ваш быстрый ответ. Есть ли какие-либо преимущества у отдельных критериев по сравнению с критериями / HQL? любой сценарий, в котором мы должны использовать отдельные критерии? пожалуйста, ответьте.

2. Итак, в основном ваше предложение состоит в том, чтобы использовать criterions / HQL поверх отдельных критериев?

3. Да, используйте criteria / HQL, когда это возможно, вместо отсоединения

4. Этот ответ неверен… Отсоединенные критерии ведут себя точно так же, как критерии, за исключением того, что вы можете изначально создавать их, не имея доступа к сеансу.

5. Я не понимаю. Каковы недостатки? Почему не использовать DetachedCriteria каждый раз?

Ответ №2:

Использование отсоединенного критерия точно такое же, как критерий, за исключением того, что вы можете выполнить первоначальное создание и настройку вашего запроса, не имея доступа к сеансу. Когда придет время выполнить ваш запрос, вы должны преобразовать его в исполняемый запрос с getExecutableCriteria(session) помощью .

Это полезно, если вы создаете сложные запросы, возможно, с помощью многоступенчатого процесса, потому что вам не нужен доступ к сеансу везде. Сеанс нужен только на последнем шаге при выполнении запроса.

Под капотом DetachedCriteria использует CriteriaImpl, который является тем же классом, который вы получаете при вызове session.createCriteria() .

Комментарии:

1. Действительно, я всегда использую отдельные критерии, и для этого требуется сеанс (для выполнения getExecutableCriteria), я пытался выяснить, кто лучший, но я предполагаю, что таким образом они одинаковы

Ответ №3:

-Отсоединенные критерии — очень хорошая альтернатива, когда сеанс гибернации отсутствует.

-Критерии находятся в режиме онлайн, что означает, что он использует объект класса сеанса. Но отсоединенный критерий отключен, потому что ему не нужен сеанс.

-Тогда критерии отсоединения допускают повторное использование кода.

 public static void main(String [] args) throws Exception {
    AnnotationConfiguration cfg = new AnnotationConfiguration();
    cfg.configure("hibernate.cfg.xml");
    SessionFactory factory = cfg.buildSessionFactory();
    Session session = factory.openSession();

    System.out.println("By using criteria");

    Criteria cr=session.createCriteria(Student.class);
    cr.add(Restrictions.eq("gender", "male"));
    cr.addOrder(Order.asc("stud_id"));
    List<Student> res=((Criteria) cr).list();
    for(int i=0;i<res.size();i  )
    {
        System.out.print( res.get(i).getStud_id() "t");
        System.out.println(res.get(i).getName());
    }

    System.out.println("nnBy using Detached criteria");
    DetachedCriteria dcr = DetachedCriteria.forClass(Student.class).add(Property.forName("gender").eq("male"));
    dcr.addOrder(Order.desc("stud_id"));
    List<Student> results = dcr.getExecutableCriteria(session).list();
    for(int i=0;i<results.size();i  )
    {
        System.out.print( results.get(i).getStud_id() "t");
        System.out.println(results.get(i).getName());
    }
  

Нажмите здесь, чтобы ознакомиться с примечаниями по реализации.

Комментарии:

1. Добавьте ссылки к своему ответу

2. docs.jboss.org/hibernate/orm/3.3/reference/en/html/… — @NSNoob

Ответ №4:

Просто в качестве напоминания. Если вы используете Spring и решили использовать HibernateTemplate, он не предоставляет метод createCriteria() .

Вы найдете только отсоединенные критерии.

Смотрите также:

HibernateTemplate javadoc