使用JPA2.0标准API和cast会导致生成的JPQL在Hibernate中失败
我是新JPA2.0 Criteria API的第一次用户,当我需要将数字字段转换为字符串以与字符串参数进行比较时,我遇到了一个问题。原因是我想搜索部分数字,所以我在CriteriaBuilder上使用“like”。下面是一个代码示例:使用JPA2.0标准API和cast会导致生成的JPQL在Hibernate中失败,hibernate,jpa-2.0,jpql,criteria-api,Hibernate,Jpa 2.0,Jpql,Criteria Api,我是新JPA2.0 Criteria API的第一次用户,当我需要将数字字段转换为字符串以与字符串参数进行比较时,我遇到了一个问题。原因是我想搜索部分数字,所以我在CriteriaBuilder上使用“like”。下面是一个代码示例: CriteriaBuilder cb = getEntityManager().getCriteriaBuilder(); CriteriaQuery<ParcelDO> cq = cb.createQuery(ParcelDO.cla
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);
}
}
在我看来,Hibernate正在生成一个不正确的JPQL
我不知道怎么了,你能帮忙吗
我使用最新的Hibernate版本(3.6.0.CR2)
谢谢正如axtavt在问题的评论中所说的,这是Hibernate 3.6中的一个bug对于JPA来说,Expression.As方法用于错误的目的。将
Expression
强制转换为Expression
不应通过。当然,最好有清晰的错误消息,而不是不正确的JPQL
正如文档中所述,它执行类型转换,这与从类型转换到其他类型的概念不同:
对表达式执行类型转换,返回新表达式
对象此方法不会导致类型转换:运行时类型
没有改变。警告:可能导致运行时故障
这是一个错误,我报告了:axtavt,谢谢。您找到解决方法了吗?最新的hibernate entitymanager(发行版)版本是3.6.0.Final。谢谢您的计算机06,您是对的。不幸的是,同样的问题,你知道是否存在一个类型转换的解决方案吗?
Predicate parcelNumberIdPredicate = cb.like(
parcelDO.<Long> get("parcelNumberId").as(String.class),
parcelNumberId + "%");
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]