JPA собственный класс возврата запроса - PullRequest
6 голосов
/ 19 марта 2012

В JPA я определил собственный sql, который будет возвращать String,

@NamedNativeQuery(name = "alert", 
query = " select distinct c.accountId from account c ", 
        resultClass = String.class)

сообщение об ошибке:

org.hibernate.MappingException: Unknown entity: java.lang.String

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

Ответы [ 4 ]

18 голосов
/ 19 марта 2012
@SqlResultSetMappings({
    @SqlResultSetMapping(name = "alertMapping", columns = {
        @ColumnResult(name = "accountId")})
})
@NamedNativeQuery(name = "alert", 
query = " select distinct c.accountId from account c ", 
        resultSetMapping = "alertMapping")

Использование:

EntityManager em = ...... / injected / etc
TypedQuery<String> query = em.createNamedQuery("alert", String.class);
List<String> accountIds = query.getResultList();

(непроверенный синтаксис, но я надеюсь, что основная идея дойдет до конца)

Для NamedNativeQueries вы можете использовать resultClass только тогда, когда результат фактически отображается наСущность.Также возможно не указывать отображение результатов, в этом случае вы получите List объекта [].Каждый элемент списка будет одной записью, и вам придется явно приводить каждый объект к нужному типу.Хм, последняя часть может быть доступна только для NativeQueries, но не по имени - извините, сейчас не уверены.

2 голосов
/ 19 марта 2012

Кажется, что Hibernate допускает только классы результатов Entity. Очевидно, что не все реализации JPA имеют это ограничение. DataNucleus JPA , например, позволяет этому запросу работать нормально.

1 голос
/ 25 февраля 2016

В моем случае я изменил версию hibernate с 3.5.6 на 4.3.3. работает нормально.

<!--     <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>3.5.6-Final</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>3.5.6-Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-annotations</artifactId>
            <version>3.5.6-Final</version>
        </dependency> -->


        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.3.3.Final</version>
        </dependency>
        <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate-core</artifactId>
          <version>4.3.3.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.3.3.Final</version>
        </dependency>
0 голосов
/ 19 марта 2012

Не включать resultClass в запросе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...