В чем разница между критериями и отдельными критериями? Когда мы должны пойти на критерии и когда мы должны пойти на отдельные критерии?
Разница между критериями и отдельными критериями в спящем режиме?
Ответ 1
Отсоединенные критерии позволяют создавать запрос без Session
. Затем вы можете выполнить поиск в произвольном сеансе.
На самом деле вы должны тщательно продумать, когда используете detached criteria
используя другой или новый сеанс (без кеширования и создания сеанса).
Они наиболее полезны для условий соединения, подвыборов и запросов вне текущего сеанса.
Другое распространенное использование для повторного использования кода. Многие разработчики объявляют их как static
запросы и выполняют их, используя базовый сеанс из разных DAO
.
Ответ 2
Использование DetachedCriteria в точности совпадает с критерием, за исключением того, что вы можете сделать первоначальное создание и настройку своего запроса без доступа к сеансу. Когда придет время для запуска вашего запроса, вы должны преобразовать его в исполняемый запрос с помощью getExecutableCriteria(session)
.
Это полезно, если вы строите сложные запросы, возможно, через многоэтапный процесс, потому что вам не нужен доступ к сеансу повсюду. Вам потребуется только сеанс на последнем этапе при выполнении запроса.
Под капотом DetachedCriteria использует CriteriaImpl, который является тем же классом, который вы получаете, если вы вызываете session.createCriteria()
.
Ответ 3
-Открытые критерии очень хороши, если сеанс спящего режима отсутствует.
- критерии находятся в режиме онлайн, а это означает, что он использует объект класса 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());
}
Нажмите здесь для заметок о реализации.
Ответ 4
Просто выступать в качестве напоминания. Если вы используете Spring и выбираете использовать HibernateTemplate, он не предоставляет метод createCriteria().
Вы найдете только DetachedCriteria.
См. также: