Выполнить произвольный sql в текущей транзакции в JPA 2.0 - PullRequest
2 голосов
/ 25 июня 2011

Я новичок в JPA 2.0 / EclipseLink / Glassfish / JEE6 и имею вид базового вопроса.

У меня есть DAO, в котором большинство сущностей отображаются непосредственно в столбцы с использованием аннотаций JPA, поэтомуЯ использую EntityManager, и он прекрасно работает без проблем.

Однако есть некоторые таблицы, в которых я сам строю операторы SQL, так как они используют специфические для оракула функции (пространственные), и я хочу очень детально контролировать SQL.Поэтому я строю его с конкатенацией строк.Я хотел бы иметь возможность зарегистрировать свои выполнения SQL в текущей транзакции, если она уже выполняется.

Поэтому, естественно, я не хочу переходить непосредственно к DriverManager и создавать свое собственное соединение, я искал какую-то функцию EntityManager.executeArbitrarySQL (String), которая бы находила текущее соединение и делала мою часть SQLтекущей транзакции.Я сошел с рокера?

1 Ответ

6 голосов
/ 25 июня 2011

Можно использовать методы 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(). Нужно будет использовать позиционные параметры (определенные с помощью заполнителя ?) для предоставления значений собственным запросам во время выполнения.

...