Можно использовать методы EntityManager.createNativeQuery()
для выполнения собственных запросов SQL в контексте того же EntityManager, который вы используете. Существует два три различных типа этих методов, и они отличаются в предоставленных аргументах.
Первый, createNativeQuery(String sqlString, Class resultClass)
ожидает, что вы предоставите объект Class, представляющий тип значений, которые будут возвращены запросом. Это нужно использовать в случае, если вы возвращаете набор значений, которые могут быть сопоставлены с классом другого определения сущности в вашей единице персистентности.
Второй createNativeQuery(String sqlString, String resultSetMapping)
ожидает, что вы предоставите имя отображения набора результатов. Отображение набора результатов должно быть определено с использованием аннотации @SqlResultSetMapping
.
Последний createNativeQuery(String sqlString)
, по-видимому, предназначен для использования в сценариях, в которых набор результатов не будет возвращаться, т. Е. При выполнении операторов INSERT, UPDATE и DELETE.
Вы также можете определить собственные запросы, используя аннотацию @NamedNativeQuery
или элемент named-native-query
в файле persistence.xml
, но они лучше подходят для сценариев, в которых вы знаете структуру запроса во время развитие. Однако вы можете создать несколько таких именованных собственных запросов для представления всех разновидностей оператора SQL, которые вы намереваетесь выполнить, а затем выполнять разные во время выполнения на основе пользовательских данных. Собственные аннотированные запросы выполняются с использованием методов EntityManager.createNamedQuery()
. Нужно будет использовать позиционные параметры (определенные с помощью заполнителя ?
) для предоставления значений собственным запросам во время выполнения.