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

gdgf

В это статье мы поговорим о 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_JOINcr.add(Restrictions.eq("ad.city","Kiev"));

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

Please follow and like us:

Leave a Comment