0

2つの列を持つエンティティがあります。

// time when the event happened (stored in UTC)
@Temporal(TemporalType.TIMESTAMP)
private Date eventTime;

// timezone offset in milliseconds
// so local millis are eventTime.getTime() + offset
@Basic
private int offset;

JPQLクエリでは、のようなものは使用できないようWHERE eventTime + offset > :parameterです。eventTimeしかし、何らかの方法でロングにキャストすることで回避することは可能ですか?もちろん、ネイティブクエリを使用するオプションがあります...

編集:これは標準ではサポートされておらず、OpenJPAのドキュメントにも記載されていないため、現時点ではおそらく不可能です。

4

2 に答える 2

1

テーブルを変更することはできないかもしれませんが、オフセット付きで計算されたタイムスタンプである別の列を追加することはできますか?次に、それを基にすべてのクエリを作成しますか?おそらくパフォーマンスも向上するでしょう。

このような問題を解決したもう1つの方法は、SQLビューを作成し、そのビューに基づいて別の@Entityを作成することです。これは、多くの複雑な計算が必要であり、コード自体にその複雑さのすべてが必要ない場合に実行しました。これは、同じ情報を取得したい他の非JPAベースのアプリケーション(レポートエンジンなど)がある場合に役立ちます。このソリューションは最終的にSQLビューを使用しますが、Java/JPAコードでネイティブクエリを処理する必要がなくなります。

于 2013-01-10T21:51:07.043 に答える
0

以前に同様の状況で行ったことは、セッター/ゲッターをプライベートまたはプロテクトとして宣言してから、パブリック@Transientゲッターに目的の計算を実行させることです。

これにより、プログラム上のすべての問題が解決されます。目的のjpasqlについては、クエリで適切な計算を実行する必要があります。

于 2013-01-10T16:59:02.467 に答える