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

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

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

Аннотации @NamedQuery и @NamedQueries используются в Java Persistence API (JPA) для определения именованных запросов (Named Queries), которые могут быть выполнены в рамках сущности. Они находятся в пакете javax.persistence (или jakarta.persistence в Jakarta EE).

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

Именованные запросы полезны для централизации и повторного использования JPQL (Java Persistence Query Language) или SQL-запросов.

@NamedQuery

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

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

Пример: "User.findByEmail".

query (обязательный):
Строка, содержащая JPQL или SQL-запрос.
Пример: "SELECT u FROM User u WHERE
u.email = :email".

lockMode (необязательный):
Определяет режим блокировки для запроса. Возможные значения:
LockModeType.NONE (по умолчанию).
LockModeType.READ.
LockModeType.WRITE.
LockModeType.OPTIMISTIC.
LockModeType.PESSIMISTIC_READ.
LockModeType.PESSIMISTIC_WRITE.


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

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


@NamedQueries

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

Пример использования:
@NamedQueries({
@NamedQuery(
name = "User.findByEmail",
query = "SELECT u FROM User u WHERE u.email = :email"
),
@NamedQuery(
name = "User.findAllActive",
query = "SELECT u FROM User u WHERE u.active = true"
)
})


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

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


Жизненный цикл

Применение: Аннотации @NamedQuery и @NamedQueries применяются на этапе загрузки метаданных сущности JPA. Они регистрируются в EntityManagerFactory и доступны через EntityManager.
Инициализация: Запросы компилируются и кэшируются при создании EntityManagerFactory.
Уничтожение: Запросы остаются доступными до тех пор, пока существует EntityManagerFactory.


Кэширование запросов:
Spring Boot поддерживает кэширование запросов через Hibernate. Например:

spring.jpa.properties.hibernate.cache.use_query_cache=true


Это может быть полезно для оптимизации производительности именованных запросов.


Интеграция с Spring Data JPA:
Spring Data JPA автоматически связывает именованные запросы с методами репозитория, если имя метода соответствует имени запроса.
Например, метод findByEmail в репозитории будет автоматически связан с именованным запросом User.findByEmail.


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

Использование JPQL:

Именованные запросы могут быть написаны на JPQL, что обеспечивает переносимость между разными базами данных.

Использование нативного SQL:
Если требуется использовать нативный SQL, можно указать это в запросе:

@NamedQuery(
name = "User.findByEmailNative",
query = "SELECT * FROM users WHERE email = :email",
resultClass = User.class
)


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

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

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


#Java #Training #Hard #Spring #SpringDataJPA #NamedQuery #NamedQueries