Начал учить и использовать 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 буду писать все с чем столкнулся.
Все проблемы и их решения.
Всем удачи и хорошего и чистого кода)))))))