Java 如何在JPQL语句中使用类型转换?
我在数据库中有两个Java 如何在JPQL语句中使用类型转换?,java,jpa,openjpa,websphere-7,Java,Jpa,Openjpa,Websphere 7,我在数据库中有两个Integer列(derby和db2)。我需要在JPQL中将它们彼此分开 如果余数是十进制数,则类型为Integer的两列返回零,例如0.25变为0等,这是可以理解的,因为类型为int 在SQL中,我可以使用这个例子 从Sometable中选择CAST(第1列为十进制(6,2))/CAST(第2列为十进制(6,2)) 但是什么是JPQL等价物呢 一种选择可能是(我还没有尝试过)在实体中有一个@Transient方法,返回十进制类型并在那里执行此计算,然后将其传递给JPQL,但我
Integer
列(derby和db2)。我需要在JPQL
中将它们彼此分开
如果余数是十进制数,则类型为Integer
的两列返回零,例如0.25
变为0
等,这是可以理解的,因为类型为int
在SQL
中,我可以使用这个例子
从Sometable中选择CAST(第1列为十进制(6,2))/CAST(第2列为十进制(6,2))代码>
但是什么是JPQL
等价物呢
一种选择可能是(我还没有尝试过)在实体中有一个@Transient
方法,返回十进制类型并在那里执行此计算,然后将其传递给JPQL
,但我宁愿让SQL
执行此工作
Mysql不需要在数据库级别强制转换。因此,不同RDBMS的行为是不同的,这很好。但是,如果不需要使用本机查询来知道此操作需要转换为十进制,那么JPQL应该做什么呢
添加方言
也无法修复它
请注意,这是JPA1,因为在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();
除法运算符对整数参数执行整数除法是一项功能。在MySQL中,整数除法必须显式选择div
,浮点除法必须显式选择/
,而在JPQL中,选择是自动进行的,就像在Java中一样
因此,我建议:
select (column1 * 1.0) / column2 from Sometable;
你基本上有三个选择
使用postload并让java来完成
在JPQL的Select语句中使用第三个类并使用新运算符
要调用构造函数并在该调用中调用,您可以管理
将被传递到SQL的数据类型,但您将得到不止一个
各种各样的东西,很好,只要从右边拿一个合适的就行了
数组索引。关于这个的更多信息
第三,像Idanmo说的那样使用本机查询
我希望div/operator在不需要强制转换的情况下返回一个十进制数,但这并没有发生。设置方言可能会/应该考虑到这一点,但也不是这样。我也倾向于nativeQuery,但我仍然不相信它不是唯一的选择。如果是这样,那真的有点悲哀+1.您能详细说明一下为什么希望方言自动执行强制转换吗?@Kaushik,因为两个整数的除法会根据基础数据库生成不同的数据类型。例如,Mysql
返回一个十进制,其中asDerby
和DB2
整数将0.25
更改为0
。因此,方言必须了解其行为并提供一种机制,特别是考虑到“JPQL”中不提供强制转换选项。我发现在JPA(至少2.0)中,在JPQL查询中使用乘法时返回的值是一个BigDecimal
,这可能不是预期的值(例如Double
)。然而,我在这里找到了解决这个问题的好办法:
select (column1 * 1.0) / column2 from Sometable;