如何在 JPQL 语句中使用类型转换?

Posted

技术标签:

【中文标题】如何在 JPQL 语句中使用类型转换?【英文标题】:How can I use typcasting inside a JPQL statement? 【发布时间】:2012-05-19 15:12:54 【问题描述】:

我在数据库中有两个 Integer 列(derby 和 db2)。我需要在JPQL 中将它们彼此分开。

如果余数是十进制数,则类型为 Integer 的两列都返回零,例如,0.25 变为 0 等等,这是可以理解的,因为类型是 int。

例如,在SQL 我可以有这个

select CAST(column1 as decimal(6,2))/CAST(column2 as decimal(6,2))from Sometable;

但是JPQL 的等价物是什么。

一个选项可能是(我还没有尝试过)是在返回 Decimal 类型的实体中使用@Transient 方法并在那里进行计算并将其传递给JPQL,但我宁愿让SQL 做这项工作。


mysql 不需要在数据库级别进行强制转换。所以不同 RDBMS 的行为是不同的,这很好。但是 JPQL 应该做什么而不需要使用本机查询来知道此操作需要强制转换为十进制。

添加方言<property name="openjpa.jdbc.DBDictionary" value="derby"/> 也没有解决。

请注意它是 JPA1

【问题讨论】:

【参考方案1】:

你基本上有三个选择。

    使用 postload,让 java 来做。 在 JPQL 的 Select 语句中使用第三个类并使用 New 运算符 调用构造函数,在调用内部你可以管理 将传递给 SQL 的数据类型,但您将获得不止一个 把东西拿回来就好了,从右边得到正确的 数组索引。更多关于此here。 如 Idanmo 所说,第三次使用 Native Query。

【讨论】:

【参考方案2】:

AFAIK 没有办法在 JPQL 中进行这种类型的转换。

我建议使用 JPA 的本机查询执行,它可以让您像使用 JDBC 一样运行 SQL 查询。

例如:

Query query = em.createNativeQuery("select CAST(column1 as decimal(6,2))/CAST(column2 as decimal(6,2)) from Sometable");

Double result = (Double) query.getSingleResult();

List<Double> results = (List<Double>) query.getResultList();

【讨论】:

我本来希望 div / 运算符在不需要强制转换的情况下返回小数,但事实并非如此。另外,设置方言会/应该考虑到这一点,但也不是这样。我也倾向于 nativeQuery ,但我仍然不相信它不仅是 option 。如果是,那真的有点悲哀。 +1。 您能否详细说明为什么您希望方言自动进行转换? @Kaushik 因为两个整数的除法会根据底层数据库产生不同的数据类型。例如Mysql 返回一个小数,其中DerbyDB2 整数将0.25 更改为0 例如。因此,方言必须知道行为并提供一种机制,特别是考虑到“JPQL”中不提供强制转换选项。【参考方案3】:

除法运算符对整数参数执行整数除法是一个特性。在 MySQL 中,您必须明确选择 div 用于整数除法,/ 用于浮点除法,而在 JPQL 中,选择是自动进行的,就像在 Java 中一样。

所以我建议:

select (column1 * 1.0) / column2 from Sometable;

【讨论】:

我发现在 JPA(至少 2.0)中,当在 JPQL 查询中使用乘法时返回的值最终是 BigDecimal,这可能不是预期的(例如 Double) .但是,我在这里找到了一个很好的解决方案:***.com/questions/34786148/…

以上是关于如何在 JPQL 语句中使用类型转换?的主要内容,如果未能解决你的问题,请参考以下文章

Java中的强制类型转换是如何转换的?

Java中的强制类型转换是如何转换的?

sql语句中如何将字符类型转换成数字类型?

sql语句中怎样将字符类型转换成数字类型

SQL语句类型转换问题

如何把ORACLE数据库BLOB类型转换成SQL的TEXT类型。