在 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 中将整数转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章