如何在JPQL语句中使用typcasting?

时间:2012-05-11 01:37:26

标签: java jpa openjpa websphere-7

我在数据库中有两个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等价物。

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


Mysql不需要在数据库级别进行转换。所以不同RDBMS的行为是不同的,这很好。但是,JPQL应该如何处理需要使用本机查询才能知道此操作需要强制转换为十进制。

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

请注意它是JPA1

3 个答案:

答案 0 :(得分:5)

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

所以我建议:

select (column1 * 1.0) / column2 from Sometable;

答案 1 :(得分:4)

你基本上有三种选择。

  1. 使用postload,让java做。
  2. 使用第三个类并在JPQL的Select语句中使用New Operator 调用构造函数和内部调用你可以管理 将传递给SQL的数据类型,但您将获得多个数据类型 一种很好的物体,从右边获得正确的物体 数组索引。更多关于here
  3. 第三次使用像Idanmo这样的Native Query。

答案 2 :(得分:3)

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();