Расширенные темы 1
SQL запросы Язык JPQL является абстракцией и «общим знаменателем» всех SQL диалектов. Очевидно, что конкретный диалект обладает бОльшими возможностями JPQL не содержит всех возможностей конкретной СУБД: Подзапросы в FROM Иерархические запросы Хранимые процедуры Оптимизация специфических SQL запросов Однако, рекомендация использовать SQL, только в случае, когда возможностей JPQL не достаточно для решения данной задачи 2
SQL запросы Пример. Использование native SQL (example 10-01) Дает преимущества: Сокращает код, по сравнению с традиционным JDBC Использование интерфейса Query, что делает код консистентным с остальным приложением 3
SQL запрос SQL запрос может быть определен статически или динамически, подобно JPQL SQL запрос не разбирается JPA провайдером, а выполняется непосредственно БД Необходимо предоставить мэпинг результатов запроса на сущность По умолчанию query engine использует O-R мэпинг сущности, чтобы понять как колонки result set мэпятся на сущность 4
Named SQL запрос 5
SQL запрос Необходимо помнить, что SQL запрос возвращает сущности, managed persistence контекстом, в котором выполняется транзакция При этом надо учитывать, что измененные данные зафиксируются в БД при commit транзакции Факт схожести обработки JPQL и SQL может быть использован для абстрагирования реального способа получения сущностей из БД для остального приложения 6
Мэпинг Result Set SQL выражения Не всегда наименование полей result set совпадает с полями сущности Не всегда result set возвращает информацию только об одной сущности Указать явный мэпинг можно указав параметры и имя мэпинга Далее, native запрос выдолняется с указанием мэпинга: Query query = em.createNativeQuery( "SELECT emp_id, name, salary, manager_id, " + "dept_id, address_id FROM EMP ", "employeeResult"); 7
Мэпинг foreign ключей При выполнении native запроса провайдер учитывает foreign ключи для single-valued ассоциаций Провайдер делает повторный запрос и выбирает соответствующие сущности из БД Нет возможности проинициализировать collection-valued отношения native запросом SELECT emp_id, name, salary, manager_id, dept_id, address_id FROM emp START WITH manager_id IS NULL CONNECT BY PRIOR emp_id = manager_id manager_id, dept_id, address_id являются вторичными ключами, которые будут разыменованы провайдером 8
Мэпинг нескольких сущностей В native SQL выражении можно возвращать данные для инициализации нескольких сущностей SELECT emp_id, name, salary, manager_id, dept_id, address_id, id, street, city, state, zip FROM emp, address WHERE address_id = id Соответствующий 9
Мэпинг алиасов колонок В случае, когда название колонки не совпадает с названием поля сущности, используется 2 подхода Использование алиасов: SELECT emp.id AS emp_id, name, salary, manager_id, dept_id, address_id, address.id, street, city, state, zip FROM emp, addressWHERE address_id = address.id Использование явного 10
Мэпинг Result Set SQL выражения. Дополнительные возможности В спецификации JPA есть также поддержка мэпинга SQL запроса в случае: Когда result set частично состоит из скалярных данных, не принадлежащих сущностям Мэпинга compound первичного ключа Мэпинга иерархий 11
Lifecycle Callbacks 12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50