Tony
Tony

Reputation: 2406

Use Hibernate createNativeQuery with TypedQuery for Integer.class

I want to use Hibernate TypedQuery for a NativeQuery with Integer.class argument. Is it possible?

NativeQuery<Integer> query = session.createNativeQuery("select 1 from dual", Integer.class);
query.list(); //<--Error.  Caused by: org.hibernate.MappingException: Unknown entity: java.lang.Integer

or

query.getResultList(); //<--Error. Caused by: org.hibernate.MappingException: Unknown entity: java.lang.Integer

or

query.getSingleResult(); //<--Error. Caused by: org.hibernate.MappingException: Unknown entity: java.lang.Integer

I've found some examples on Web that suggest, this is theoretically possible.

see getTaskCount()

Update 1: I've updated the example.

Update 2: Add getSingleResult() example.

Upvotes: 2

Views: 4887

Answers (2)

coladict
coladict

Reputation: 5095

The resultClass parameter only accepts entity classes.

Also, when using native queries you are never guaranteed what what the return type for numbers will be, so using Integer or Long in a typecast will often blow-up on you when it's java.math.BigInteger.

What you need to do is:

Query query = em.createNativeQuery("select 1 from dual");  
Number nval = (Number) query.getSingleResult(); 
Integer val = nval == null ? null : nval.intValue();

Or for a list:

Query query = em.createNativeQuery("select 1 from dual");
List<Number> l = (List<Number>) query.getResultList();
for (Number nval : l) {
    Integer val = nval == null ? null : nval.intValue();
    // do stuff
}

Upvotes: 3

sgraton
sgraton

Reputation: 106

Second parameter of createNativeQuery() should be a mapped entity. Integer is not. So you have to do :

Query query = em.createNativeQuery("select 1 from dual");  
Integer val = (Integer) query.getSingleResult(); 

Upvotes: 2

Related Questions