【问题标题】:org.hibernate.MappingException: Unknown entity: java.lang.Longorg.hibernate.MappingException:未知实体:java.lang.Long
【发布时间】:2011-11-28 02:12:03
【问题描述】:

我正在尝试创建一个返回 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>

这是我得到的错误:

错误 - 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 在 java.lang 中找不到 Long?

感谢您提供任何线索

编辑:我尝试删除“结果类”注释:

    <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>

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

【问题讨论】:

    标签: hibernate orm jpa-2.0


    【解决方案1】:

    无需进一步研究,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>
    

    【讨论】:

    • 谢谢,我尝试删除结果类注释并收到此错误:嵌套异常是 org.hibernate.cfg.NotYetImplementedException:尚不支持纯本机标量查询
    • @slashdottir 是否有任何额外信息对您有所帮助,或者您是否以其他方式解决了问题?
    • 我最终不得不放弃返回 Long 并最终返回一个映射的 pojo 对象......因为事实证明,在数据库中存在唯一性约束,这意味着每行只有 1 行标识符,我能够以这种方式解决这个问题
    【解决方案2】:
    <named-native-query name="getCaseNumberByCommId">
      <query>SELECT case_id FROM communications WHERE comm_id =(?1)</query>
    </named-native-query>
    

    这样的东西对我有用。

    【讨论】:

      猜你喜欢
      • 2011-04-29
      • 1970-01-01
      • 2014-04-16
      • 2012-12-04
      • 2014-08-05
      • 2012-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多