一尘不染

使用JPA 2.0 Criteria API和强制转换会导致生成的JPQL在Hibernate中失败

hibernate

我是新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)

谢谢


阅读 214

收藏
2020-06-20

共1个答案

一尘不染

正如axtavt在问题的注释中所述,它是Hibernate
3.6中的错误http://opensource.atlassian.com/projects/hibernate/browse/HHH-5755

2020-06-20