2013-09-27 2 views
4

Я новичок во всем этом материале Hibernate/JPA, поэтому постараюсь быть максимально ясным.Hibernate - createNativeQuery с результатом «non-entity class»

Есть ли способ в Hibernate использовать createNativeQuery для выбора одного или нескольких полей в запросе без использования класса Entity в качестве возвращаемого объекта?

Я пытаюсь сделать это без использования каких-либо связанных с XML материалов.

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); 

Используя это я имею исключение: Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.MappingException: Unknown entity: java.lang.String

Благодарности

Edit:

Я также попытался:

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); 
} 

С той же Exception: Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to [Ljava.lang.Object;

Edit (2): Я начинаю думать, что это либо ошибка в Hibernate или это невозможно сделать такие вещи ...

ответ

1

Просто попробуйте позвонить createNativeQuery()String.class без прохождения. Если столбец name имеет строковый тип в базе данных query.getSingleResult(), он действительно вернет String.

8

Проблема в том, что вы передаете String.class в качестве второго параметра в createNativeQuery. Это сделает попытку спящего режима использовать String.class для создания сопоставления для набора результатов. Он может создавать это сопоставление только из классов сущностей, а String не является сущностным классом, потому что он не сопоставляется с таблицей.

К счастью, решение состоит в том, чтобы просто использовать перегруженную версию createNativeQuery, которая не требует второго параметра.

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); 
0

попробовать

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); 
} 

ВНайти здесь

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

+0

же исключение брошено: Исключение в потоке "главный" java.lang.ClassCastException: java.lang. Строку нельзя передать в [Ljava.lang.Object; – Joshua

5

В случае Native запроса или jpql с именем столбца EntityManager Возвращает список массива объектов.

так, чтобы получить список результатов.

получить его в

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

затем итерацию над ним: -

for (Object[] record : listResults) { 

      //Iterate Logic will come here 

        } 
+0

То же исключение: Исключение в потоке «main» java.lang.ClassCastException: java.lang.String нельзя передать в [Ljava.lang.Object; – Joshua

+0

Я обновил свой ответ, пожалуйста, проверьте сейчас. – AjGupta

+0

listResults - это список объектов [], поэтому вам нужно выполнить Итерацию по объекту [], чтобы получить ваши данные. – Bob

0
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); 
+1

Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и почему оно решает проблему, улучшит долгосрочная ценность ответа. – wasthishelpful

Смежные вопросы