JPA 原生查询返回类

8
在JPA中,我定义了一个返回String类型的本地SQL。
@NamedNativeQuery(name = "alert", 
query = " select distinct c.accountId from account c ", 
        resultClass = String.class)

错误信息为:
org.hibernate.MappingException: Unknown entity: java.lang.String

有什么线索吗?谢谢。
4个回答

18
@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。也可以不指定结果映射,这种情况下,你将得到一个Object[]列表。列表中的每个元素都是一条记录,并且您需要显式地将每个Object转换为所需的类型。嗯,最后一部分可能仅适用于NativeQueries而不是Named - 抱歉,目前不确定。

回答不错,但我在JPA规范中没有找到关于NamedNativeQueries仅允许“实体”结果类的内容。你有章节/页码吗?谢谢。 - Neil Stockton
@esej “嗯,最后一部分可能只适用于NativeQueries而不是Named - 抱歉目前不确定。”- 我不确定你的意思,但我可以确认将结果列表视为Object[],就像在这里(https://dev59.com/kGbWa4cB1Zd3GeqPSgiC#19790951)与_@NamedNativeQuery_一起使用也是可行的。 - Hein Blöd

2

似乎Hibernate只允许使用实体结果类。显然,并非所有的JPA实现都有这个限制。例如,DataNucleus JPA可以很好地运行该查询。


1
在我的情况下,我将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>

1

在查询声明中不要包含resultClass


如果我将其删除,它会出现另一个错误。 原因是:org.hibernate.cfg.NotYetImplementedException:纯本地标量查询尚未得到支持。 - user595234
2
我不想走这条路。字符串会更简单。 - user595234

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接