Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2013_1 / КСТ / Разработка веб-приложений.pdf
Скачиваний:
160
Добавлен:
23.02.2015
Размер:
2.74 Mб
Скачать

CriteriaQuery<Pet> cq = cb.createQuery(Pet.class); Metamodel m = em.getMetamodel();

EntityType<Pet> Pet_ = m.entity(Pet.class); Root<Pet> pet = cq.from(Pet.class); cq.where(cb.like(pet.get(Pet_.name)), "*do");

Можно использовать логические операции and, or и not для задания сложных выражений:

CriteriaQuery<Pet> cq = cb.createQuery(Pet.class); Metamodel m = em.getMetamodel();

EntityType<Pet> Pet_ = m.entity(Pet.class); Root<Pet> pet = cq.from(Pet.class); cq.where(cb.equal(pet.get(Pet_.name), "Fido")

.and(cb.equal(pet.get(Pet_.color), "brown");

14.7.Управление результатами запросов

Взапросах, возвращающих большое количество результатов, данные полезно организовать с помощью методов orderBy, groupBy и having.

Метод CriteriaQuery.orderBy устанавливает порядок сортировки и передается в объект Order. Объект Order создается вызовом метода CriteriaBuilder.asc или CriteriaBuilder.desc, соответственно для прямой и обратной сортировки.

Примеры:

CriteriaQuery<Pet> cq = cb.createQuery(Pet.class); Root<Pet> pet = cq.from(Pet.class); cq.select(pet); cq.orderBy(cb.desc(pet.get(Pet_.birthday));

CriteriaQuery<Pet> cq = cb.createQuery(Pet.class); Root<Pet> pet = cq.from(Pet.class);

Join<Owner, Address> address = cq.join(Pet_.owners).join(Owner_.address); cq.select(pet); cq.orderBy(cb.asc(address.get(Address_.postalCode));

CriteriaQuery<Pet> cq = cb.createQuery(Pet.class); Root<Pet> pet = cq.from(Pet.class);

Join<Pet, Owner> owner = cq.join(Pet_.owners); cq.select(pet); cq.orderBy(cb.asc(owner.get(Owner_.lastName), owner.get(Owner_.firstName));

Метод CriteriaQuery.groupBy группирует результаты запроса. Пример:

CriteriaQuery<Pet> cq = cb.createQuery(Pet.class); Root<Pet> pet = cq.from(Pet.class); cq.groupBy(pet.get(Pet_.color));

178

Метод CriteriaQuery.having используется одновременно с groupBy для фильтрации групп. Метод получает условное выражение как параметр и позволяет ограничивать результат запроса. Пример:

CriteriaQuery<Pet> cq = cb.createQuery(Pet.class); Root<Pet> pet = cq.from(Pet.class); cq.groupBy(pet.get(Pet_.color)); cq.having(cb.in(pet.get(Pet_.color)).value("brown"). value("blonde");

14.8. Исполнение запросов

Для подготовки запроса к исполнению создается объект TypedQuery<T> с типом результата запроса вызовом метода EntityManager.createQuery. Запрос исполняется

вызовом метода getSingleResult или getResultList для объекта класса TypedQuery<T>.

Примеры:

CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);

...

TypedQuery<Pet> q = em.createQuery(cq); Pet result = q.getSingleResult();

CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);

...

TypedQuery<Pet> q = em.createQuery(cq); List<Pet> results = q.getResultList();

179

Соседние файлы в папке КСТ