I have two Integer
columns in the database (derby and db2). I need to divide them with each other inside a JPQL
.
Both columns being of type Integer
return zero if remainder is a decimal number e.g 0.25
becomes 0
etc and understandably so since type is int.
In SQL
I could have this for example
select CAST(column1 as decimal(6,2))/CAST(column2 as decimal(6,2))from Sometable;
but what is JPQL
equivalent .
One option might be (I have not tried yet) is to have a @Transient
method in the entity returning the Decimal type and doing this calculation there and pass that to JPQL
but I would rather let SQL
do this work.
Mysql does not require casting at database level . So Behaviour for different RDBMS is different which is fine . But what should JPQL do with out needing to use a native query to know that cast to decimal is needed for this operation.
Adding dialect <property name="openjpa.jdbc.DBDictionary" value="derby"/>
did not fix it either.
Please note it is JPA1
A subselect is a query embedded into another query. It's a powerful feature you probably know from SQL. Unfortunately, JPQL supports it only in the WHERE clause and not in the SELECT or FROM clause. Subqueries can return one or multiple records and can use the aliases defined in the outer query.
JPQL provides an additional type of identification variable, a join variable, which represent a more limited iteration over specified collections of objects. In JPQL, JOIN can only appear in a FROM clause. The INNER keyword is optional (i.e. INNER JOIN is equivalent to JOIN).
Execute the query using an appropriate Query's method: getSingleResult or getResultList. In the case of an update or delete operation, though, you must use the executeUpdate method, which returns the number of entity instances updated or deleted.
Solution: With JPA and Hibernate, you have to set the pagination information on the Query interface and not in the query String as you know it from SQL. You can do that by calling the setFirstResult(int startPosition) and setMaxResults(int maxResults) methods.
You have basically three options.
That the division operator performs integer division on integer arguments is a feature. In MySQL you have to explicitly choose div
for integer division and /
for floating point division, whereas in JPQL the choice is made automatically just like in Java.
So I suggest:
select (column1 * 1.0) / column2 from Sometable;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With