我是新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)
謝謝
這是一個錯誤,我報告它:http://opensource.atlassian.com/projects/hibernate/browse/HHH-5755 – axtavt 2010-11-24 18:24:25
axtavt,謝謝。你有沒有找到解決方法? – bruma 2010-11-24 18:40:11