Рубрики
Без рубрики

Сопоставление запроса hibernate в пользовательский класс

Узнайте, как сопоставить результаты запросов в пользовательские объекты с помощью Hibernate

Автор оригинала: baeldung.

Сопоставление запроса hibernate в пользовательский класс

1. Обзор

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

В этом быстром учебнике, Мы увидим, как мы можем достичь этого в Hibernate с помощью пользовательского класса.

2. Организации

Во-первых, давайте посмотрим на объекты, которые мы будем использовать для получения данных:

@Entity
public class DeptEmployee {
 
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private long id;

    private String employeeNumber;

    private String designation;

    private String name;

    @ManyToOne
    private Department department;

    // constructor, getters and setters 
} 

@Entity
public class Department {
 
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private long id;

    private String name;

    @OneToMany(mappedBy="department")
    private List employees;

    public Department(String name) {
        this.name = name;
    }
    
    // getters and setters 
}

Здесь у нас есть две сущности – DeptEmployee и Департамент . Для простоты предположим, что DeptEmployee может принадлежать только к одному отдел.

Но, Департамент может иметь несколько DeptEmployees .

3. Класс результатов пользовательского запроса

Допустим, мы хотим распечатать список всех сотрудников только с их именем и названием их отдела.

Как правило, мы извлекаем эти данные с помощью такого запроса:

Query query = session.createQuery("from com.baeldung.hibernate.entities.DeptEmployee");
List deptEmployees = query.list();

Это позволит получить все сотрудники, все их свойства, связанный отдел, и все его свойства.

Но, в данном конкретном случае, это может быть немного дорого, как нам нужно только имя сотрудника и название отдела.

Один из способов получить только информацию, которая нам нужна, это указать свойства в избранном пункте.

Но, когда мы делаем это, Hibernate возвращает список массивов вместо списка Объектов:

Query query = session.createQuery("select m.name, m.department.name from com.baeldung.hibernate.entities.DeptEmployee m");
List managers = query.list();
Object[] manager = (Object[]) managers.get(0);
assertEquals("John Smith", manager[0]);
assertEquals("Sales", manager[1]);

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

Давайте посмотрим на Результат класс, который мы будем использовать для заполнения полученных данных в:

public class Result {
    private String employeeName;
    
    private String departmentName;
    
    public Result(String employeeName, String departmentName) {
        this.employeeName = employeeName;
        this.departmentName = departmentName;
    }

    public Result() {
    }

    // getters and setters 
}

Обратите внимание, что класс не является сущностью, а просто POJO. Тем не менее, мы также можем использовать сущность до тех пор, пока у нее есть конструктор, который принимает все атрибуты, которые мы хотим заполнить в качестве параметров.

Мы увидим, почему конструктор имеет важное значение в следующем разделе.

4. Использование конструктора в штаб-квартире

Теперь давайте посмотрим на H’L, который использует этот класс:

Query query = session.createQuery("select new com.baeldung.hibernate.pojo.Result(m.name, m.department.name)" 
  + " from com.baeldung.hibernate.entities.DeptEmployee m");
List results = query.list();
Result result = results.get(0);
assertEquals("John Smith", result.getEmployeeName());
assertEquals("Sales", result.getDepartmentName());

Здесь мы используем конструктора, который мы определили в Результат класса вместе с свойствами, которые мы хотим получить. Это вернет список Результат объекты с данными, заселенными из столбцов.

Как мы видим, возвращенный список легче обрабатывать, чем использовать список массивов объектов.

Важно отметить, что мы должны использовать полностью квалифицированное название класса в запросе.

5. Использование resultTransformer

Альтернативой использованию конструктора в запросе H’L является использование РезультатТрансформатор:

Query query = session.createQuery("select m.name as employeeName, m.department.name as departmentName" 
  + " from com.baeldung.hibernate.entities.DeptEmployee m");
query.setResultTransformer(Transformers.aliasToBean(Result.class));
List results = query.list();
Result result = results.get(0);
assertEquals("John Smith", result.getEmployeeName());
assertEquals("Sales", result.getDepartmentName());

Мы используем Трансформаторы. псевдонимToBean () метод использования полученных данных для заполнения Результат Объектов.

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

Обратите внимание, что Запрос.setРесультТрансформер ( РезультатТрансформатор ) был deprecated с Hibernate 5.2.

6. Заключение

В этой статье мы увидели, как пользовательский класс может быть использован для получения данных в легко читаемой форме.

Исходный код, который сопровождает эту статью, доступен более на GitHub .