Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hibernate - createNativeQuery with "non-entity class" result

I'm new to all this Hibernate/JPA stuff, so i will try to be as clear as possible.

Is there any way in Hibernate to use createNativeQuery to select a single/or multiple fields in a query without using an Entity class as the return object ?

I'm trying to do this without using any XML related stuff.

Query query = getEntityManager().createNativeQuery("select name from contact where id_contact = :idContact", String.class);
query.setParameter("idContact", 9293L);
Object string = query.getSingleResult();
System.out.println(string);

Using this i have the Exception : Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.MappingException: Unknown entity: java.lang.String

Thanks

Edit :

I also tried :

Query query = getEntityManager().createNativeQuery("select name from contact where id_contact = :idContact");
query.setParameter("idContact", 9293L);
List list = query.getResultList();
if (!list.isEmpty()){ 
    Object string = list.get(0);
    System.out.println(string);
}

With the same Exception : Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to [Ljava.lang.Object;

Edit (2) : I'm starting to think it's either a bug in Hibernate or it's impossible to do such things...

like image 838
Joshua Avatar asked Sep 27 '13 12:09

Joshua


1 Answers

The problem is that you are passing String.class as the second parameter to createNativeQuery. This will make hibernate attempt to use the String.class to create a mapping for the result set. It can only create this mapping from entity classes and String is not an entity class because it isn't mapped to a table.

Fortunately, the solution is to simply use an overloaded version of createNativeQuery that doesn't require a second parameter.

String SQL = ".."; //same SQL as you had before
Query query = getEntityManager().createNativeQuery(SQL); //no entity mapping
query.setParameter("idContact", 9293L);
Object string = query.getSingleResult();
System.out.println(string);
like image 134
cyon Avatar answered Oct 29 '22 03:10

cyon