ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Использование raw SQL в Spring Data Repository: руководство

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Конечно, это вполне возможно. Для того чтобы использовать прямые SQL-запросы в Spring, можно применять аннотацию @Query с установленным параметром nativeQuery=true. Возьмем за пример следующий код:

Java
Скопировать код
public interface MyRepository extends JpaRepository<MyEntity, Long> {
  
  @Query(value = "SELECT * FROM my_table WHERE my_column = :value", nativeQuery = true)
  List<MyEntity> findByColumn(@Param("value") String value);
}

И тут мы видим, что с помощью аннотации @Query выполнен нативный SQL-запрос.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Верное использование инструментов: Сценарии применения чистого SQL

Spring Data Repositories предлагает обширные возможности для выполнения стандартных операций. Но иногда возникают ситуации, когда требуется работать непосредственно с SQL.

Создание представлений: Использование проекций

Для создания специальных представлений данных моделей применяются проекции:

Java
Скопировать код
public interface MyEntityProjection {
  String getMyColumn();
}

Проекция в репозитории используется следующим образом:

Java
Скопировать код
public interface MyRepository extends JpaRepository<MyEntity, Long> {
  
  @Query(value = "SELECT my_column as myColumn FROM my_table", nativeQuery = true)
  List<MyEntityProjection> findProjectedBy();
}

Прямой доступ с EntityManager

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

Java
Скопировать код
@Autowired
private EntityManager entityManager;

public List<MyEntity> customQueryMethod() {
  return entityManager.createNativeQuery("SELECT * FROM my_table", MyEntity.class).getResultList();
}

Пользовательский вывод: Маппинг массивов и классов ответов

Результаты SQL-запросов можно маппировать в массивы:

Java
Скопировать код
List<Object[]> results = query.getResultList();
for(Object[] result : results){
  // Обработка результатов
}

Или может быть создан специальный класс для хранения результатов:

Java
Скопировать код
public class CustomResponse {
  private String columnValue; // значение поля может быть любым
  
  // геттеры и сеттеры
}

List<CustomResponse> customResponses = entityManager
  .createNativeQuery("SELECT my_column FROM my_table", CustomResponse.class)
  .getResultList();

Безопасность превыше всего: Безопасность и принципы хорошей практики

Очень важно обезопасить SQL-запросы, используя параметризацию:

Java
Скопировать код
@Query(value = "SELECT * FROM my_table WHERE my_column = :value", nativeQuery = true)
List<MyEntity> findByColumn(@Param("value") String value);

Проверка пользовательского ввода

Всегда защищайте себя от SQL-инъекций:

Java
Скопировать код
try {
  // Запрос
} catch (PersistenceException e) {
  // Обработка исключения
}

Анализ производительности

Не забывайте контролировать эффективность запросов:

SQL
Скопировать код
SELECT * FROM my_table WHERE my_column = :value LIMIT 10

Визуализация

Инструменты под рукой – это Spring Data Repositories:

Markdown
Скопировать код
🔨🔧🔩 (Базовый инструментарий)

Правила использования – это непосредственно SQL:

Markdown
Скопировать код
📜 (Инструкции)

Сочетая их, можно добиться нужных результатов:

Markdown
Скопировать код
🔨🔧🔩 + 📜 = 🏗️ (Построение индивидуальных решений)

Публикация через API-точки доступа

Ваши SQL-запросы могут быть опубликованы через API:

Java
Скопировать код
@RestController
public class MyController {

  @Autowired
  private MyRepository myRepository;

  @GetMapping("/search")
  public List<MyEntity> search(@RequestParam String value) {
    return myRepository.findByColumn(value);
  }
}

Полезные материалы

  1. Официальное руководство по использованию аннотации @Query в Spring Data JPA.
  2. Документация по интеграции Spring Framework с JDBC.
  3. Расширения Spring Data JDBC, включая возможности Oracle RAC.
  4. Официальная документация по работе с проекциями в Spring Data JPA.
  5. Руководство по основам работы с JPA в Spring.