Hibernate tutorial

Начал учить и использовать Hibernate. Сразу скажу что очень много впечатлений. Множество возможностей они предоставляют и их вполне достаточно для того чтоб решать многие задачи.

Всем привет.

Начал учить и использовать Hibernate. Сразу скажу что очень много впечатлений. Множество возможностей они предоставляют и их вполне достаточно для того чтоб решать многие задачи.

После маленького учебного проекта рещили внедрить Hibernate в наш новый проект. Сразу скажу что изначально там использовались все наработки которые мы делали со старыми проектами. Сначала использовали JPA.

И первое с чем столкнулись это то что раньше мы могли использовать следующую конструкцию:

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

query.SetParameter("lst", lst);

это типа для запроса где мы используем IN() хотели бы положить в него массив ID.

Когда мы перешли на Hibernate эта строка осталась и мы ее не трогали. Но как показали тесты установка параметра таким способом не работает, он просто игнорируется в запросе и не выдает никаких ошибок.

Тогда изучив все методы Query от Hibernate мы узнали что для таких случаев нужно использовать

setParameterList("lst", lst);

И тогда будет Вам радость))))) Все работает и все нормально. Скажу сразу что следует сначала изучить что дает нам Query от Hibernate.

Второе что очень понравилось это то, что в query.SetParameter("name", value) если value == NULL то этот параметр будет проигнорирован в финальном запросе, что очень удобно.

Но стоит обратить внимание на то что если Вы используете Restrictions и  value==NULL оно не  игнорируется в финальном запросе и можете получить очень интерессные данные. В этом будьте очень внимательны.

Ну конечно мы начали использовать Detached Criteria. Погуглили и начали использовать решение которое нашли. Сначала все работало просто супер. Обращаю Ваше внимание на таки строки:

 


DetachedCriteria criteria;

//Например мы тянем по порциях данные, но перед этим хотели бы знать сколько их вообще

Integer total = Integer.valueOf(criteria.setProjection(Projections.rowCount()).getExecutableCriteria(getCurrentSession()) .uniqueResult().toString());

//а дальше берем лист с нужными параметрами с какого элемента и сколько   

criteria.setProjection(null);

setCollection((List<T>)criteria.getExecutableCriteria(getCurrentSession()).setFirstResult(firstResult).setMaxResults(pageSise).list());

Давайте определим Entity для которого мы все это используем:


@Entity

public class Dog {

   private int Id;

   private int age;

   private String name;

   private Breed breed;

}


@Entity

public class Breed{

   private int Id;

   private String nameBr;

   private String Country;

   private String description;

   private

}

Мы имеем связь Dog and Breed. Что очень часто случается что у Вас есть зависимости и даже много)))

И если мы будет использовать наше решение для поиска с приминением для criteria свойства только Dog и захотели вытянуть с 1 по 5 запись, когда у нас их 100 - все работает.


Но когда мы захотели искать по свойствам Breed


criteria.createAlias("breed", "br", JoinType.INNER_JOIN,Restrictions.eq("br.country", selectedCountry));

Мы столкнемся с тем что count будет правильным но результирующий лист будет содержать эленты как типа Dog так и Breed. И Ваш метод не сможет вернуть list типа который вы обьявили в сигнатуре.

Для того что бы все работало нужно просто добавить одну строчку

criteria.setResultTransformer(Criteria.ROOT_ENTITY);

после criteria.setProjection(null);

таким способом Вы даете понять для criteria type of Result object и тогда Ваш list будет правильным и все элементы будут типа Dog.

Ждите еще постов на эту тему. Так как начал изучать Hibernate буду писать все с чем столкнулся.

Все проблемы и их решения.

Всем удачи и хорошего и чистого кода)))))))



 

comments powered by Disqus

Интересное

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


Курсы валют

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

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