在JPQL中将整数转换为字符串

Pra*_*tap 5 jpa jpql jpa-2.0

我想要一个JPQL查询,可能看起来像:

    entityManager.createQuery("Select a.* from A a WHERE CAST(a.num AS TEXT) LIKE '%345%' ", A.class);
Run Code Online (Sandbox Code Playgroud)

其中a.num是整数。我想将此转换为String以使用LIKE标准。但是,上面的转换在JPQL中不起作用。关于如何实现这一点的任何想法?

Sta*_*eev 8

您能具体一点,您的问题是什么?您是否有某种错误,或者查询结果是错误的?

因为这段代码对我来说很好用:

session.createQuery("from MyObject where CAST(id as text) like :id").setParameter("id", "%1").getResultList();
Run Code Online (Sandbox Code Playgroud)

我正在使用Hibernate 5.2和Postgresql 9.5。另外,如果您在理解问题出在哪里时,可以尝试编辑hibernate.cfg.xml或用于使Hibernate显示其发送的查询的任何配置文件,方法如下:

<property name="hibernate.show_sql">true</property>
Run Code Online (Sandbox Code Playgroud)

  • 是的,此代码将在您使用休眠会话创建查询时起作用。而我正在使用JPA实体管理器执行相同的操作。我也曾在查询中尝试过相同的转换,但失败,但出现异常,例如“无法CAST到文本”(不记得确切的意思,因为我现在没有代码)。似乎JPQL不支持转换。 (2认同)

Hen*_*wan 5

我也有同样的需求。这适用于JPA 2.0和Hibernate 5.0.2:

entityManager.createQuery(
    "Select a.* from A a WHERE CONCAT(a.num, '') LIKE '%345%' ", A.class);
Run Code Online (Sandbox Code Playgroud)


GKi*_*lin 5

来自 hibernate 文档,“cast(... as ...)”,其中第二个参数是 Hibernate 类型的名称。根据休眠类型列表,它应该是string(区分大小写!)。

所以请求应该是:

entityManager.createQuery("select a.* from A a WHERE CAST(a.num AS string) LIKE '%345%' ", A.class);
Run Code Online (Sandbox Code Playgroud)

是从以下原因中获取和检查的:org.hibernate.QueryException:无法解析 CAST 的请求类型:INT答案。