我是新JPA 2.0 Criteria API的首次用户,当我需要将数字字段转换为String并将其与String参数进行比较时遇到问题。原因是我想搜索部分数字,因此我在CriteriaBuilder上使用了“赞”。这是一个代码示例:
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将Path转换为CriteriaBuilder上的like方法所需的Expression。
现在,当我运行并执行此代码时,基本的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)
谢谢
正如axtavt在问题的注释中所述,它是Hibernate 3.6中的错误http://opensource.atlassian.com/projects/hibernate/browse/HHH-5755