Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JPA2.0标准API和cast会导致生成的JPQL在Hibernate中失败_Hibernate_Jpa 2.0_Jpql_Criteria Api - Fatal编程技术网

使用JPA2.0标准API和cast会导致生成的JPQL在Hibernate中失败

使用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

我是新JPA2.0 Criteria API的第一次用户,当我需要将数字字段转换为字符串以与字符串参数进行比较时,我遇到了一个问题。原因是我想搜索部分数字,所以我在CriteriaBuilder上使用“like”。下面是一个代码示例:

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]