如何在JPQL语句中使用typcasting?
我在数据库中有两个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应该如何处理需要使用本机查询来知道此操作需要强制转换为十进制。
添加方言也没有修复它。
请注意它是JPA1
你基本上有三个选择。
- 使用postload并让java做到这一点。
- 使用第三个类并在JPQL的Select语句中使用New Operator来调用构造函数,在调用内部,您可以管理将传递给SQL的数据类型,但是您将获得多种类型的对象,这样就可以了解正确的对象从右数组索引。更多关于这里 。
- 第三次使用像Idanmo这样的Native Query说。
除法运算符对整数参数执行整数除法是一个特征。 在MySQL中,你必须明确地选择div
作为整数除法和/
用于浮点除法,而在JPQL中,选择是自动进行的,就像在Java中一样。
所以我建议:
select (column1 * 1.0) / column2 from Sometable;
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 results = (List ) query.getResultList();