【问题标题】:Casting Integer to String in JPQL在 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 创建查询。

标签: jpa jpa-2.0 jpql


【解决方案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
        猜你喜欢
        • 1970-01-01
        • 2010-12-27
        • 2012-02-21
        • 2010-12-31
        相关资源
        最近更新 更多