org.hibernate.MappingException: неизвестный объект: java.lang.Long - PullRequest
6 голосов
/ 30 сентября 2011

Я пытаюсь создать named-native-запрос, который возвращает Long.

Вот мой файл orm.xml (максимально упрощенный)

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd"
  version="2.0">

<named-native-query name="getCaseNumberByCommId" result-class="java.lang.Long">
  <query>SELECT case_id FROM communications WHERE comm_id =(?1)</query>
</named-native-query>

</entity-mappings>

этополученная ошибка:

ERROR - org.hibernate.impl.SessionFactoryImpl - ошибка в именованном запросе: getCaseNumberByCommId [coral: launch] org.hibernate.MappingException: неизвестный объект: java.lang.Long

Я также попытался просто указать "Long"

<named-native-query name="getCaseNumberByCommId" result-class="Long">
  <query>SELECT case_id FROM communications WHERE comm_id =(?1)</query>
</named-native-query>

и странно получить эту ошибку:

Причина: org.hibernate.AnnotationException: Невозможно найти класс сущности: Long... Причины: java.lang.ClassNotFoundException: Long

Java не может найти Long в java.lang?

Спасибо за любые подсказки

edit : я попытался удалить аннотацию 'result-class':

    <named-native-query name="getCaseNumberByCommId" >
        <query>SELECT case_id FROM communications WHERE comm_id =(?1)</query>
    </named-native-query>

и получить эту ошибку:

вложенным исключением является org.hibernate.cfg.NotYetImplementedException: чистые собственные скалярные запросы еще не поддерживаются

Обновление *

Я никогда не находил способ сделать это, но поскольку база данных имела ограничение уникальности для comm_id, я смог просто вернуть сопоставленный объект pojo вместо счетчика.

например

    <named-native-query name="getByCommId" result-class="com.foo.model.Communication">
        <query>SELECT * FROM communications WHERE comm_id =(?1)</query>
    </named-native-query>

и затем извлеките нужный case_id из возвращенного pojo.

1 Ответ

8 голосов
/ 30 сентября 2011

Не вдаваясь в подробности, result-class должен быть одним из ваших сопоставленных объектов, и, поскольку Long не является одной из ваших сущностей, вы получаете AnnotationException.

Попробуйте удалить result-class из сопоставления, поскольку он используется только для построения запросов, которые возвращают Entity объектов.


Редактировать:

В отношении: org.hibernate.cfg.NotYetImplementedException: Pure native scalar queries are not yet supported:

После быстрого поиска вокруг я нашелэто:

https://hibernate.atlassian.net/browse/ANN-661

Где я читаю:

Обходной путь заключается в выполнении таких запросов с помощью Session.createSQLQuery () или прямойJDBC.

Здесь есть несколько примеров таких запросов: http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/querysql.html#d0e17378

т.е.

sess.createSQLQuery("SELECT * FROM CATS").list();

sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").list();

или далее в Example 18.4 http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/querysql.html#querysql-namedqueries

<sql-query name="mySqlQuery">
    <return-scalar column="name" type="string"/>
    <return-scalar column="age" type="long"/>
    SELECT p.NAME AS name, 
           p.AGE AS age,
    FROM PERSON p WHERE p.NAME LIKE 'Hiber%'
</sql-query>
...