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

Posted

技术标签:

【中文标题】在 JPQL 中将整数转换为字符串【英文标题】:Casting Integer to String in JPQL 【发布时间】:2018-02-21 15:44:50 【问题描述】:

我想要一个 JPQL 查询,如下所示:

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

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

【问题讨论】:

您可能需要使用本机查询来执行此类转换。 除了 JPQL 中不存在“SELECT *”。谁知道什么是“不起作用”……也许调用了一些 SQL? @billyfrost 编辑了查询以包含 a.*。我的意思是铸造在 jpql 中不能像这样工作。例外情况就像...不能转换为文本。我正在使用 JPA entitymanager 创建查询。 【参考方案1】:

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

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

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

我正在使用 Hibernate 5.2 和 Postgresql 9.5。 此外,如果您无法理解发生了什么问题,您可以尝试编辑 hibernate.cfg.xml 或您用来使 Hibernate 显示它发送的查询的任何配置文件,方法如下:

<property name="hibernate.show_sql">true</property>

【讨论】:

是的,当您使用 hibernate 的会话创建查询时,此代码将起作用。而我正在使用 JPA entitymanager 来做同样的事情。我也在我的查询中尝试了相同的转换,但失败了一个例外,比如“无法转换为文本”(不记得完全正确,因为我现在没有代码)。似乎 JPQL 不支持强制转换。 嗯,据我所知,唯一的其他选择是使用本机查询,正如之前建议的那样。虽然它通常看起来有点难看(也许,甚至非常难看),但据我所知,对于某些操作来说,这是唯一的方法。 啊,转换类型区分大小写? TEXT 产生错误,但 text 工作正常。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

所以请求应该是:

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

从Caused by: org.hibernate.QueryException: Could not resolve requested type for CAST : INT 回答中获取并检查。

【讨论】:

【参考方案4】:

您可以在select 子句中使用to_char() 函数,但是您需要单独选择所有a.num 字段,而不是*

在 postgresql 中,您需要为 to_char()function 指定一个掩码,所以它应该是 to_char(field, mask),例如我们可以提供 'FM999999999999999999' 作为掩码来接受最大可能的位数。

您的查询将是这样的:

Select *, to_char(a.num, 'FM999999999999999999') as num from A a WHERE num LIKE '%345%'

您可以查看Postgresql Data Type Formatting Functions了解更多详情。

要使用EntityManager 在您的代码中编写查询,您可以使用.createNativeQuery() 方法创建一个本机查询,您的代码应该是这样的:

em.createNativeQuery("Select *, to_char(a.num, 'FM999999999999999999') as num from A a WHERE num LIKE '%345%'");

【讨论】:

这个问题更多地与 JPQL 相关,而不是与 postgres 相关。我正在使用 JPA 的 entitymanager.createQuery()。我将不得不检查这个函数是否作为 JPQL 查询的一部分工作。 @Pratap 是的,EntityManager 可以创建一个像这样的本机查询 èm.createNativeQuery()`,看看我的编辑。【参考方案5】:

您可以简单地使用 CAST(num as string)。它对我有用

【讨论】:

【参考方案6】:

正确的查询是:

entityManager.createQuery("Select a.* from A a WHERE CAST(a.num AS String) LIKE '%345%' ", A.class);

【讨论】:

那就是:org.hibernate.QueryException: Could not resolve requested type for CAST : String

以上是关于在 JPQL 中将整数转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章

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

在python中将字符串/字符转换为整数

如何在C#中将字符串转换为整数

如何在 Objective-C 中将字符串转换为整数? [复制]

如何在 Excel VBA 中将整数转换为字符串?

如何在 C++ 中将大数字符串转换为整数?