Разница между критериями и отдельными критериями в спящем режиме? - PullRequest
41 голосов
/ 17 октября 2011

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

Ответы [ 4 ]

32 голосов
/ 17 октября 2011

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

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

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

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

11 голосов
/ 07 апреля 2014

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

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

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

4 голосов
/ 11 февраля 2016

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

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

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

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("\n\nBy 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());
    }

Нажмите здесь для заметок о реализации.

3 голосов
/ 04 января 2013

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

Вы найдете только DetachedCriteria.

См. Также:

HibernateTemplate javadoc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...