org.hibernate.MappingException:未知实体:java.lang.Long

sla*_*tir 6 orm hibernate jpa-2.0

我正在尝试创建一个返回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>
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

错误 - 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>
Run Code Online (Sandbox Code Playgroud)

并奇怪地得到这个错误:

引起:org.hibernate.AnnotationException:无法找到entity-class:Long ...引起:java.lang.ClassNotFoundException:Long

Java在java.lang中找不到Long?

谢谢你的任何线索

编辑:我尝试删除'result-class'注释:

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

并得到此错误:

嵌套异常是org.hibernate.cfg.NotYetImplementedException:尚不支持纯本机标量查询

更新*

我从来没有找到这样做的方法,但由于数据库对comm_id有唯一性约束,我只能返回映射的pojo对象而不是count.

例如

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

然后从返回的pojo中拉出所需的case_id.

edw*_*att 8

如果不进一步研究,那么它result-class应该是您的映射实体之一,因为Long它不是您正在接收的实体之一AnnotationException.

尝试result-class从映射中删除它,因为它仅用于构建返回EntityObjects的查询.


编辑:

关于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>
Run Code Online (Sandbox Code Playgroud)