ORM позволяет выполнять SQL запросы к базе данных, возвращая как списки отдельных полей, так и экземпляры сущностей. Для этого
необходимо создать объект Query
или TypedQuery
вызовом одного из методов EntityManager.createNativeQuery()
.
Если выполняется выборка отдельных колонок таблицы, то результирующий список будет содержать строки в виде Object[]
. Например:
Query query = em.createNativeQuery("select ID, NAME from SALES_CUSTOMER where NAME like ?1"); query.setParameter(1, "%Company%"); List list = query.getResultList(); for (Iterator it = list.iterator(); it.hasNext(); ) { Object[] row = (Object[]) it.next(); UUID id = (UUID) row[0]; String name = (String) row[1]; }
Следует иметь в виду, при использовании SQL колонки, соответствующие атрибутам сущностей типа UUID
, возвращаются в виде UUID
или в виде String
, в зависимости от используемой СУБД и JDBC драйвера:
-
HSQLDB -
String
-
PostgreSQL, драйвер
postgresql-8.3-603.jdbc4.jar
-String
-
PostgreSQL, драйвер
postgresql-9.1-901.jdbc4.jar
-UUID
-
Microsoft SQL Server, драйвер
jtds-1.2.4.jar
-String
-
Oracle -
String
Параметры этого типа также должны задаваться либо как UUID
, либо своим строковым представлением, в зависимости от используемой СУБД и JDBC драйвера. Для обеспечения независимости кода
от используемой СУБД рекомендуется использовать
DbTypeConverter
.
Если вместе с текстом запроса передан класс результирующей сущности, то возвращается TypedQuery
и после выполнения производится попытка отображения результатов запроса на атрибуты сущности. Например:
TypedQuery<Customer> query = em.createNativeQuery( "select * from SALES_CUSTOMER where NAME like ?1", Customer.class); query.setParameter(1, "%Company%"); List<Customer> list = query.getResultList();
Поведение SQL запросов, возвращающих сущности, и модифицирующих запросов (update
, delete
), по отношению к текущему персистентному контексту аналогично описанному для JPQL запросов.
См. также Раздел 4.7.10, «Выполнение SQL с помощью QueryRunner».