Hibernate detached criteria и не только

В это статье мы поговорим о Hibernate detached criteria и о некоторых нюансах, которые Вам обязательно помогут. Также расмотрим проблемы, которые могут встречаться при работе с Hibernate

Давайте определим для чего вообще нужна detached criteria. Она нужна для получения критерии обьекта в состоянии "detached mode" когда сесси недоступна. Тоесть это идеальный выход для ситуации когда вы используете какойто класс как Criteria Condition Holder, где вы храните поля необходимые для сервиса. И также метод который вернет критерию (detached criteia). А с detached criteria через метод getExecutableCriteria() мы получим критерию для использования в сервисе. Перед тем приводить пример давайте напомним состояния еобьекто (entity) которые могут быть: 

  • transient object. Объекты в данном статусе — это заполненные экземпляры классов-сущностей. Могут быть сохранены в БД. Не присоединены к сессии. Поле Id не должно быть заполнено, иначе объект имеет статус detached ;
  • persistent object. Объект в данном статусе — так называемая хранимая сущность, которая присоединена к конкретной сессии. Только в этом статусе объект взаимодействует с базой данных. При работе с объектом данного типа в рамках транзакции все изменения объекта записываются в базу;
  • detached object. Объект в данном статусе — это объект, отсоединённый от сессии, может существовать или не существовать в БД.

Это основа и ее нужно знать каждому. После всего высше упомянутого давайте приступим к примерам. И так содаем класс, который будет хранить нашу критерию:

public class ConditionHolder{

private String name;

private String email;


public DetachedCriteria getDetachedCriteria(){

DetachedCriteria cr =DetachedCriteria.forClass(MyEntity.class);

//добавляем условия

cr.add(Restrictions.eq("name", name));

//добавим сортировку

cr.addOrder(Order.desc("name"));

return cr;

}

}

Наш класс для хранения критерии готов. А теперь давайте напишем метод который будет по заданной критерии возвращать результат в ввиде списка:

 

public List<MyEntity> loadListByDetachedCriteria(DetachedCriteria cr){

List<MyEntity> lst = new ArrayList<>();

if(cr!=null){

lst = cr.getExecutableCriteria(getCurrentSession())

.setFirstResult(0).setMaxResults(Integer.MAX_VALUE)

.list();

}

returnr lst;

}

 

Вот и все. Но это банальный просто метод. У критерии есть много возможностей. Стоить взглянуть на Restrictions, доступны следующие методе:

between(String propertyName, Object lo, Object hi) 

eq(String propertyName, Object value) 

ge(String propertyName, Object value) 

ilike(String propertyName, Object value) 

in(String propertyName, Object[] values) 

isEmpty(String propertyName) 

isNotEmpty(String propertyName) 

like(String propertyName, Object value) 

И множество других. На 100% все что вам нужно вы найдете. Также есть возможность создания алиасов для связующих таблиц.

cr.createAlias("address", "ad");

// также можна join JoinType.INNER_JOIN

cr.add(Restrictions.eq("ad.city","Kiev"));


Это удобно и полезно когда ищете по свойству свзной таблицы. Возможностей еще много. В следующий раз расмотрим criteria.setResultTransformer() - очень полезная штука.

comments powered by Disqus

Интересное

Стив Джобс о Mac OS X:
«Я убежден в том, что половина того что отделяет успешных предпринимателей от неудачников — это настойчивость.».
Марк Эллиот Цукерберг:
«Люди всегда немного скептически относятся к чему-то быстрорастущему, но им нужно просто взглянуть на то, что делается.».
Марк Эллиот Цукерберг:
"Множество конфиденциальных вещей намного проще держать в централизованной системе."
Стив Джобс о операционной системе Google Android:
Мы не лезем в поиск, но они решили заняться телефонами. Не надо заблуждаться, они хотят уничтожить iPhone. Мы им не позволим.
Стив Джобс о Mac OS X:
«Мы сделали значки на экране такими красивыми, что вам захочется их лизнуть».


Курсы валют

bank-ua.com bank-ua.com bank-ua.com

Стоит взглянуть