9

データベースには 2 つのInteger列があります (derby と db2)。内でそれらを互いに分割する必要がありJPQLます。

Integer残りが 10 進数の場合、両方の列の型はゼロを返します。たとえば、型が int であるため、etc になります0.250

SQLたとえば、これを使用できます

select CAST(column1 as decimal(6,2))/CAST(column2 as decimal(6,2))from Sometable;

しかし、JPQL同等のものは何ですか。

1つのオプションは(私はまだ試していません)@Transient、エンティティに Decimal 型を返すメソッドを持ち、そこでこの計算を行い、それを渡すことですがJPQL、むしろSQLこの作業をさせたいと思います。


Mysql は、データベース レベルでのキャストを必要としません。したがって、異なる RDBMS の動作は異なりますが、これは問題ありません。しかし、この操作には 10 進数へのキャストが必要であることを知るためにネイティブ クエリを使用する必要なく、JPQL は何をすべきでしょうか。

方言を追加<property name="openjpa.jdbc.DBDictionary" value="derby"/>しても修正されませんでした。

JPA1であることに注意してください

4

3 に答える 3

8

基本的に 3 つのオプションがあります。

  1. postload を使用し、Java に任せます。
  2. 3番目のクラスを使用し、JPQLのSelectステートメントでNew Operatorを使用してコンストラクターを呼び出し、その呼び出し内でSQLに渡されるデータ型を管理できますが、複数の種類のオブジェクトが返されますが、正しいものを取得するだけで問題ありません正しい配列インデックスから。詳細はこちら.
  3. Idanmoが言ったように、3番目にNative Queryを使用します。
于 2012-05-19T00:11:45.357 に答える
6

除算演算子が整数引数に対して整数除算を実行することは、機能です。divMySQLでは整数除算と浮動小数点除算を明示的に選択する必要がありますが/、JPQL では Java と同様に自動的に選択されます。

だから私は提案します:

select (column1 * 1.0) / column2 from Sometable;
于 2012-05-17T05:27:18.873 に答える
3

JPQLでこの種のキャストを行う方法はありません。

JDBC を使用している場合と同じように SQL クエリを実行できる JPA のネイティブ クエリ実行を使用することをお勧めします。

例えば:

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 に答える