#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() .
Вы найдете только отсоединенные критерии.
Смотрите также: