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)
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() – очень полезная штука.