JPA — создание нетипизированных запросов и запросов со специальным типом

При работе с базой данных часто возникает потребность получить набор данных, не относящихся к какой-либо сущности напрямую. Для этих целей можно создать специальный запрос.

Используемые технологии
  • Spring 4.1.5.RELEASE
  • Hibernate 5.0.1.Final
  • JPA 2.1
  • MySQL 5.6.25
  • IntelliJ IDEA 14
  • Maven 3.2.5

1. Описание задачи

Допустим у нас есть таблица с контактными данными и телефонными номерами. Нам нужно сделать выборку из базы данных, которая будет содержать определенное количество столбцов (но не все). Такая задача может возникать, к примеру, при создании отчета. Пусть необходимо выбрать только те контакты, у которых есть домашний телефон и при этом отобразить только имя, фамилию и номер этого телефона.

Если сделать запрос к БД напрямую, то мы получим массив данных (разные сущности) из разных таблиц (контакты и телефоны), который потом придется перебирать и составлять отчет вручную.

Мы пойдем другим путем:

  • создадим запрос с нетипизированным результатом.
  • а так же рассмотрим вариант в виде запроса со специальным типом результата и конструирующим выражением.

2. Структура проекта

Все таблицы, настройки и другое взяты из JPA – пример приложения Hello World.

3. JPA — запрос с нетипизированным результатом

Создадим класс и запрос с нетипизированным результатом ContactSummaryUntypeImpl:

При указании конкретных столбцов (firstName, lastName, telNumber) в операторе JPQL будет возвращен итератор с результирующим списком. Обычным перебором выводим в консоль результат.

4. JPA — Запрос со специальным типом результата и конструирующим выражением

Более интересное решение заключается в создании специального класса, который будет содержать в себе запрашиваемые данные (данные для каждой колонки). Другими словами мы заставим JPA конструировать POJO класс для каждой полученной записи.

4.1 Сервис запроса со специальным типом

4.2 Конструирующий класс

Для нашего примера был создан класс, который содержит три запрашиваемых свойства:

4.3. Реализация интерфейса

Класс реализующий интерфейс, в котором содержится запрос к базе данных:

Тот же самый запрос, но с добавлением конструктора ContactSummary() и указания типа возвращаемого результата ContactSummary.class.

5. Тест запроса

Напомню, что этот метод main() был взять из статьи, указанной вначале. Здесь просто добавлены два рассмотренных здесь запроса.

Исходные коды

JPA Tutorial — untypeQuery

Share Button
4
7677 Total Views 1 Views Today

Добавить комментарий