2012-03-18 52 views
4

在JPA,我定义了一个本地的SQL将返回字符串,JPA本机查询返回类

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

错误消息是

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

任何线索?由于

回答

0

不要在查询声明resultClass

+0

如果我删除它,它会得到另一个错误。 引起:org.hibernate.cfg.NotYetImplementedException:纯原生标量查询尚不支持 – user595234 2012-03-18 22:17:02

+0

所以尝试Account.class – Andrey 2012-03-18 22:19:12

+2

我不想这样。字符串会更简单。 – user595234 2012-03-18 22:21:49

17
@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 []的List。列表中的每个元素都将是一条记录,并且您必须明确地将每个对象转换为您想要的类型。嗯,最后一部分可能只适用于NativeQueries而不是命名 - 现在抱歉不确定。

+0

好的答案,但我没有发现有关NamedNativeQueries的只有在JPA规范中允许“实体”结果类的位。你有段/页码吗? Thx – 2012-03-19 18:21:08

+0

@esej“嗯,最后一部分可能只适用于NativeQueries,而不是命名 - 现在抱歉不确定。” - 我不知道你是什么意思,但我可以证实,将结果列表视为Object [],就像它完成[这里](http://stackoverflow.com/questions/11452586/sqlresultsetmapping-columns-as -and-entities/19790951#19790951)也适用于_ @ NamedNativeQuery_。 – 2015-04-15 09:45:43

2

似乎Hibernate只允许实体结果类。显然不是所有的JPA实现都有这个限制。例如,DataNucleus JPA允许该查询正常运行。

1

在我的情况下,我将休眠版本从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>