9

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

4

3 回答 3

8

你基本上有三个选择。

  1. 使用 postload 并让 java 来做。
  2. 使用第三个类并在 JPQL 的 Select 语句中使用 New Operator 来调用构造函数,在调用内部,您可以管理将传递给 SQL 的数据类型,但您将得到不止一种对象,只要得到正确的对象就好了从右数组索引。更多关于这个here
  3. 第三次使用像 Idanmo 说的 Native Query。
于 2012-05-19T00:11:45.357 回答
6

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

所以我建议:

select (column1 * 1.0) / column2 from Sometable;
于 2012-05-17T05:27:18.873 回答
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();
于 2012-05-13T12:38:46.687 回答