当前位置: 首页 > 面试题库 >

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

令狐俊风
2023-03-14
问题内容

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



 类似资料:
  • 方言设置为java,我的drools版本是6.4.0。我如何避免这个错误? 编辑:字符串到int:

  • 问题内容: 我是Java的新手,正在尝试理解为什么第一个代码片段不会导致此异常,而第二个代码片段会导致此异常。由于在两种情况下都将字符串数组传递到Arrays.asList中,所以两个代码片段都不应该产生异常还是不产生异常? 第一个代码段(毫无例外): 第二段(导致上述异常): 如果相关,我正在Eclipse Helios中使用JavaSE 1.6。 问题答案: 对我来说(使用Java 1.6.0

  • 我已经在我的gradle文件中启用了来使用ProGuard的特性来混淆代码,结果导致一些错误。 注意:动态创建的类实例有1个类强制转换。您可能会考虑显式保留提到的类和/或它们的实现(使用'-keep')。 警告:有309个未解析的类或接口引用。您可能需要添加丢失的库JAR或更新它们的版本。如果您的代码在没有丢失类的情况下运行良好,则可以使用'-dontwarn'选项抑制警告。(http://pro

  • 我正在Clojure中开发一个简单的hello world web应用程序。但是,在我将模式库添加到我的项目之后,当我试图使用构建一个uberjar时,我开始出现以下错误。奇怪的是,在使用启动时,应用程序仍然通过单元测试,并且运行时没有错误。 下面是我使用schema的源文件。为了简洁起见,我省略了其余的源文件,但如果有人想查看其余的文件,请直接询问。 我已经尝试过禁用AOT编译,因为这似乎是正常

  • 在我们的项目中,我们使用了Spring Boot 2.1.3、Spring Data Rest 3.1.5、Spring Data JPA 2.1.5和Hibernate 5.3.7,我们使用了Spring Framework 5.1和Hibernate 5.3的更改提供的一些新的可能性,即这一个和这一个。此外,我们将Spring Data JPA与Spring Data Rest存储库一起使用。

  • 那么谁能解释一下这里的区别是什么,为什么java会做这样的设计呢?多谢了。 编辑:一个类似的问题