Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在JPQL语句中使用类型转换?_Java_Jpa_Openjpa_Websphere 7 - Fatal编程技术网

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
    返回一个十进制,其中as
    Derby
    DB2
    整数将
    0.25
    更改为
    0
    。因此,方言必须了解其行为并提供一种机制,特别是考虑到“JPQL”中不提供强制转换选项。我发现在JPA(至少2.0)中,在JPQL查询中使用乘法时返回的值是一个
    BigDecimal
    ,这可能不是预期的值(例如
    Double
    )。然而,我在这里找到了解决这个问题的好办法:
    select (column1 * 1.0) / column2 from Sometable;