Выполнить произвольный sql в текущей транзакции в JPA 2.0

Я новичок в JPA 2.0/EclipseLink/Glassfish/JEE6, и у меня есть основной вопрос.

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

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

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


person Kevin Pauli    schedule 24.06.2011    source источник


Ответы (1)


Можно использовать методы EntityManager.createNativeQuery() для выполнения собственных запросов SQL в контексте того же EntityManager, который вы используете. Существует два три разных типа этих методов, и они различаются предоставленными аргументами.

Первый, createNativeQuery(String sqlString, Class resultClass) ожидает, что вы предоставите объект класса, представляющий тип значений, которые будут возвращены запросом. Это должно использоваться в случае, если вы возвращаете набор значений, которые могут быть сопоставлены с классом другого определения сущности в вашей единице персистентности.

Второй createNativeQuery(String sqlString, String resultSetMapping) ожидает, что вы предоставите имя сопоставления набора результатов. Отображение набора результатов должно быть определено с помощью @SqlResultSetMapping. аннотация.

Последний createNativeQuery(String sqlString), по-видимому, предназначен для использования в сценариях, где набор результатов не будет возвращен, то есть при выполнении операторов INSERT, UPDATE и DELETE.

Вы также можете определить собственные запросы, используя аннотацию @NamedNativeQuery или элемент named-native-query в вашем файле persistence.xml, но они лучше подходят для сценариев, когда вы знаете структуру запроса во время разработки. Однако вы можете создать несколько таких именованных собственных запросов для представления всех разновидностей оператора SQL, который вы собираетесь выполнять, а затем выполнять разные запросы во время выполнения на основе пользовательских входных данных. Аннотированные собственные запросы выполняются с использованием методов EntityManager.createNamedQuery(). Нужно будет использовать позиционные параметры (определенные с помощью заполнителя ?) для предоставления значений собственным запросам во время выполнения.

person Vineet Reynolds    schedule 24.06.2011