2010-11-24 36 views
6

我是新JPA 2.0 Criteria API的第一次用戶,當我需要將一個數字字段強制轉換爲字符串時,我遇到了問題它帶有一個String參數。原因是我想搜索部分數字,所以我在CriteriaBuilder上使用'like'。下面是一個代碼示例:使用JPA 2.0 Criteria API並強制生成JPQL在休眠時失敗

CriteriaBuilder cb = getEntityManager().getCriteriaBuilder(); 
     CriteriaQuery<ParcelDO> cq = cb.createQuery(ParcelDO.class); 
     Root<ParcelDO> parcelDO = cq.from(ParcelDO.class); 
     cq.select(parcelDO); 

     String parcelNumberId = parcelSearchDetailDO.getParcelNumberId(); 
     if (parcelNumberId != null && !parcelNumberId.isEmpty()) { 
      Predicate parcelNumberIdPredicate = cb.like(
        parcelDO.<Long> get("parcelNumberId").as(String.class), 
        parcelNumberId + "%"); 

      if (cq.getRestriction() != null) { 
       cq.where(cq.getRestriction(), parcelNumberIdPredicate); 
      } else { 
       cq.where(parcelNumberIdPredicate); 
      } 
     } 

的重要組成部分,是

Predicate parcelNumberIdPredicate = cb.like(
        parcelDO.<Long> get("parcelNumberId").as(String.class), 
        parcelNumberId + "%"); 

,我使用Criteria API將路徑轉換成所需的CriteriaBuilder類似方法的表達。

現在,當我運行,並且執行該代碼,底層JPA 2.0實現的Hibernate失敗,出現以下異常:

Caused by: org.hibernate.hql.ast.QuerySyntaxException: 
expecting CLOSE, found '(' near line 1, column 117 
[select generatedAlias0 from domain.ParcelDO as generatedAlias0 where 
cast(generatedAlias0.parcelNumberId as varchar2(255 char)) like :param0] 

我看來像Hibernate是爲了產生一個JPQL這是不正確的。

我不知道什麼是錯,你能幫忙嗎?

我用的是最新版本的Hibernate(3.6.0.CR2)

謝謝

+0

這是一個錯誤,我報告它:http://opensource.atlassian.com/projects/hibernate/browse/HHH-5755 – axtavt 2010-11-24 18:24:25

+0

axtavt,謝謝。你有沒有找到解決方法? – bruma 2010-11-24 18:40:11

回答

4

的錯誤是什麼它涉及JPA,Expression.as方法用於服務錯誤的目的。鑄造Expression<Number>Expression<String>不應該通過Expression.as工作。當然,如果有明確的錯誤消息而不是錯誤的JPQL,那將會很好。

如所述在文檔時,它執行強制轉換,這是不同的概念的轉換從類型到其他:

取決於該表達執行類型轉換,返回新的表達 對象。此方法不會導致類型轉換:運行時類型 不會更改。警告:可能會導致運行時失敗。