Java for Beginner
675 subscribers
549 photos
155 videos
12 files
841 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Аннотации @NamedNativeQuery и @NamedNativeQueries

Аннотации @NamedNativeQuery и @NamedNativeQueries используются в Java Persistence API (JPA) для определения именованных нативных SQL-запросов (Named Native Queries). Они находятся в пакете javax.persistence (или jakarta.persistence в Jakarta EE).

@NamedNativeQuery: Позволяет определить один именованный нативный SQL-запрос.
@NamedNativeQueries: Позволяет определить несколько именованных нативных SQL-запросов для одной сущности.

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

@NamedNativeQuery

Аннотация @NamedNativeQuery принимает следующие параметры:

name (обязательный):
Уникальное имя запроса. Обычно используется формат EntityName.queryName.
Пример: "User.findByEmailNative".

query (обязательный):

Строка, содержащая нативный SQL-запрос.
Пример: "SELECT * FROM users WHERE email = :email".


resultClass (необязательный):
Класс сущности, к которому будет маппиться результат запроса.
Пример: resultClass = User.class.


resultSetMapping (необязательный):
Имя маппинга результата, определенного с помощью @SqlResultSetMapping.
Используется, если результат запроса не соответствует напрямую сущности.


hints (необязательный):
Массив подсказок (hints), которые могут быть переданы провайдеру JPA (например, Hibernate) для настройки выполнения запроса.
Пример:
@QueryHint(name = "org.hibernate.cacheable", value = "true").

Пример использования:
@NamedNativeQuery(
name = "User.findByEmailNative",
query = "SELECT * FROM users WHERE email = :email",
resultClass = User.class,
hints = {
@QueryHint(name = "org.hibernate.cacheable", value = "true")
}
)


@NamedNativeQueries

Аннотация @NamedNativeQueries используется для группировки нескольких аннотаций @NamedNativeQuery. Она принимает массив @NamedNativeQuery.

Пример использования:
@NamedNativeQueries({
@NamedNativeQuery(
name = "User.findByEmailNative",
query = "SELECT * FROM users WHERE email = :email",
resultClass = User.class
),
@NamedNativeQuery(
name = "User.findAllActiveNative",
query = "SELECT * FROM users WHERE active = 1",
resultClass = User.class
)
})


Значения по умолчанию

Если параметры resultClass, resultSetMapping или hints не указаны, используются значения по умолчанию (отсутствие маппинга и пустой массив подсказок соответственно).

Варианты настройки

Использование нативного SQL:
Нативные запросы позволяют использовать специфические для базы данных функции и оптимизации.

Маппинг результатов:
Если результат запроса не соответствует напрямую сущности, можно использовать @SqlResultSetMapping для кастомизации маппинга.

Пример использования @SqlResultSetMapping:
@SqlResultSetMapping(
name = "UserMapping",
entities = @EntityResult(entityClass = User.class)
)
@NamedNativeQuery(
name = "User.findByEmailNative",
query = "SELECT * FROM users WHERE email = :email",
resultSetMapping = "UserMapping"
)


Кэширование запросов:
Для оптимизации производительности можно включить кэширование запросов через подсказки (hints).

Динамические нативные запросы:
Если именованные нативные запросы недостаточно гибки, можно использовать @Query с параметром nativeQuery = true в Spring Data JPA для определения запросов непосредственно в репозитории.

Пример использования @Query:
public interface UserRepository extends JpaRepository<User, Long> {
@Query(nativeQuery = true, value = "SELECT * FROM users WHERE email = :email")
User findByEmailNative(@Param("email") String email);
}


#Java #Training #Hard #Spring #SpringDataJPA #NamedNativeQuery #NamedNativeQueries