Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Field's value of native query in JPA

How to get value of some fields in a native query (JPA)?

For example I want to get name and age of customer table:

Query q = em.createNativeQuery("SELECT name,age FROM customer WHERE id=...");

Note: I don't want to map results to entities. I just want to get the value of the field.

Thanks

like image 313
Nav Avatar asked Aug 30 '10 10:08

Nav


People also ask

What is the use of native query in JPA?

Native query refers to actual sql queries (referring to actual database objects). These queries are the sql statements which can be directly executed in database using a database client. 2. Named query is the way you define your query by giving it a name.

How does JPA return map key values?

There is no standard way to get JPA to return a map. Iterating manually should be fine. The time to iterate a list/map in memory is going to be small relative to the time to execute/return the query results.

How do you map native query results to entities?

You can do this with a @SqlResultSetMapping which specifies the mapping for each entity attribute. As you can see in the code snippet, the @SqlResultSetMapping requires a name and an @EntityResult annotation which defines the mapping to the entity.


1 Answers

A native query with multiple select expressions returns an Object[] (or List<Object[]>). From the specification:

3.6.1 Query Interface

...

The elements of the result of a Java Persistence query whose SELECT clause consists of more than one select expression are of type Object[]. If the SELECT clause consists of only one select expression, the elements of the query result are of type Object. When native SQL queries are used, the SQL result set mapping (see section 3.6.6), determines how many items (entities, scalar values, etc.) are returned. If multiple items are returned, the elements of the query result are of type Object[]. If only a single item is returned as a result of the SQL result set mapping or if a result class is specified, the elements of the query result are of type Object.

So, to get the name and age in your example, you'd have to do something like this:

Query q = em.createNativeQuery("SELECT name,age FROM customer WHERE id = ?1");
q.setParameter(1, customerId);
Object[] result = (Object[])q.getSingleResult();
String name = result[0];
int age = result[1];

References

  • JPA 1.0 specification
    • Section 3.6.1 "Query Interface"
    • Section 3.6.6 "SQL Queries"
like image 58
Pascal Thivent Avatar answered Oct 09 '22 01:10

Pascal Thivent