4.4.4.5. Выполнение SQL запросов
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 запросов.
См. также Выполнение SQL с помощью QueryRunner.