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 буду писать все с чем столкнулся.

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

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

Please follow and like us:

Leave a Comment