14

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...

Joshua
  • 627
  • 4
  • 9
  • 21

6 Answers6

18

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);
cyon
  • 9,340
  • 4
  • 22
  • 26
7

In case of Native query or jpql with column name EntityManager Returns a List of array of objects.

so to get Result List.

receive it in a

 List<Object[]> listResults = query.getResultList();

then iterate over it:-

for (Object[] record : listResults) {

            //Iterate Logic will come here

                    }
AjGupta
  • 138
  • 6
  • listResults is a list of Object[] so you need to Iterate over the Object[] in order to get your data – Bob Oct 15 '15 at 15:34
4

Just try to call createNativeQuery() without passing String.class. If the name column is of string-type in database query.getSingleResult() will actually return a String.

Adam Dyga
  • 8,666
  • 4
  • 27
  • 35
2
String SQL = ".."; //same SQL as you had before
Query query = getEntityManager().createNativeQuery(SQL); //no entity mapping
query.setParameter("idContact", 9293L);
String string = (String)query.getSingleResult();
System.out.println(string);
  • 3
    While this code may answer the question, providing additional context regarding how and/or why it solves the problem would improve the answer's long-term value. – rocambille May 10 '17 at 09:11
2

For Hibernate 5.0

Query query = getEntityManager().createNativeQuery(sql);
List<Object[]> objects = query.getResultList();
System.out.println(objects.get(0)[0]);

https://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/chapters/query/native/Native.html

karepu
  • 198
  • 1
  • 6
0

try

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

In the Look here

http://sysout.be/2011/03/09/why-you-should-never-use-getsingleresult-in-jpa

sunysen
  • 2,265
  • 1
  • 12
  • 13
  • Same exception thrown : Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to [Ljava.lang.Object; – Joshua Sep 27 '13 at 13:11