2011-05-13 69 views
1

我有一個方法試圖使用HQL在數據庫中執行相當複雜的查詢。我的實體類都用註釋映射,並在編譯期間被發現,未明確列出。爲什麼HQL會導致「類未映射」異常?

在下面的代碼:

List<Message> ms = ((Session) entityManager.getDelegate()) 
      .createCriteria(MessageCRI.class).list(); 
    log.info("Got " + ms.size() + " CRIs"); 

    List<Message> msgs = ((Session) entityManager.getDelegate()) 
      .createQuery(
        "from MessageCRI c where c.rfdId in (select id from MessageRFD rfd where rfd.ssrId = :ssrId)") 
      .setParameter("ssrId", ssrId).list(); 

第一個調用成功 - 我在日誌中收到一條消息,指出「用了2個投資中心」或諸如此類。然而,下一次調用失敗,產生一個根本原因爲「org.hibernate.hql.ast.QuerySyntaxException:MessageCRI未映射的堆棧」

我可能會丟失什麼?

回答

3

是您@Entity註釋接收name? (在這種情況下,使用它的名字)。

超出主題,但由於您使用的是JPA EntityManager,爲什麼不堅持JPQL syntax?如果你使用JPA 2,你甚至可以利用它的類型安全Criteria API。在非常特殊的情況下,本地語法仍然可能需要,但在有選項時遵循標準始終是一個不錯的選擇。

+0

我會使用Criteria API,但這看起來比我可以輕鬆清楚地處理使用Criteria更復雜。我可能會重新審視這個決定。我也正在重新編譯使用我設置的名稱(以便表名與現有的表匹配)。 – Bret 2011-05-13 18:03:04

+0

好運氣。是的,詳細程度是不能步入某種東西的合理原因(仍然,我已經習慣了標準API)。至於JPQL,它和HQL一樣冗長。您可以隨時將其移植到不同的ORM解決方案(比如EclipseLink,或者甚至可能更特別的東西,例如Google Datastore的DataNucleus JPA實現:D。我們從不知道......) – 2011-05-13 18:13:45

1

實體HQL由其實體名稱標識。默認情況下,它匹配其類的短名稱,但它可以通過@Entity標註的name屬性更改。確保你不覆蓋它。

+0

我做覆蓋它使我的表名稱將匹配現有的,傳統的表。我現在正在重新編譯使用這個名字,手指交叉。 – Bret 2011-05-13 18:03:36

+1

@Bret:表名在'@Table(name = ...)'中指定。 '@ Entity(name = ...)'與它無關。 – axtavt 2011-05-13 18:16:25

相關問題