Типобезопасный подход к запросам помогает проверить правильность оператора запроса во время компиляции.

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

Проблема с JPQL или собственным запросом

При написании операторов запроса мы в основном используем JPQL или собственный запрос и пишем буквально в строке.

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

Что такое типобезопасные запросы?

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

Как Spring Data JPA поддерживает типобезопасные запросы?

Чтобы применять типобезопасные запросы в приложении Spring, мы можем выбрать Criteria API или Querydsl. Criteria API — это альтернативный способ написания запросов в JPA. Исполняющий запрос будет сгенерирован во время выполнения и, конечно же, безопасный для типов. Criteria API является частью спецификации Java Persistence API. Помимо Criteria API, у нас есть популярная библиотека с открытым исходным кодом для написания типобезопасных запросов, которая легко интегрируется в приложение Spring — Querydsl.

И Criteria API, и Querydsl используют процессор аннотаций Java 6 для создания классов метамодели, которые описывают информацию о классе сохраняемости (классе сущностей) и помогают библиотеке генерировать правильные операторы запросов. Для целей этой статьи я не буду подробно описывать это.

Чтобы проиллюстрировать это, мы попытаемся написать метод доступа к данным для запроса данных из базы данных в соответствии с приведенным выше запросом:

select * from customer where id = ?

JPQL или собственный запрос

API критериев

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

Для поддержки Querydsl данные Spring предоставляют интерфейс с именем QuerydslPredicateExecutor для распространенных ситуаций, разработчикам нужно только расширить свой репозиторий QuerydslPredicateExecutor.

Вернемся к примеру. Преобразование приведенного выше оператора запроса в реализацию запроса DSL выполняется так же, как в приведенном ниже фрагменте кода.

Видите ли вы, что в примере с критериями и Querydsl у нас есть два класса: один — Customer_ , а другой — QCustomer? Эти классы называются классами метамодели, которые будут генерироваться AnnotationProcessor. Я не буду описывать их в этой статье, я хотел бы поделиться с вами ресурсом, чтобы узнать больше о классах метамоделей. https://developer.ibm.com/languages/java/articles/j-typesafejpa/#metamodel-of-a-persistent-domain

Вывод

В этой статье я расскажу о запросах с безопасностью типов и их преимуществах, а также о том, как Spring поддерживает создание запросов с безопасностью типов. Я надеюсь, что эта статья познакомит вас с концепцией типизированных запросов и может рассмотреть возможность ее использования в вашем приложении в соответствии с ее потребностями.