最近、プロジェクトをHibernate 4からHibernate 5.2に更新しました。そのため、JPAを使用するためのすべての基準を更新する必要がありました。ほとんどのものは正常に動作していますが、動作しなくなったクエリが1つあります。照会しているテーブルのフィールドの1つは、データベース内のDATE型です。JPA CreateNativeQueryが間違った日付を返す
テーブルに直接クエリを実行すると、日付が返されます。たとえば、「2017-04-20」となります。しかし、JPAのcreateNativeQueryを使用して開発サーバーで同じクエリを実行すると、日付「2017-04-19」が返されます。
私は正確なクエリを実行しても問題はないと思いますmysql端末とjavaを介して同じクエリを実行し、異なる結果を得る。私が実行するクエリは、私の下の例で記録されているものです。私は自分のローカル環境で、私のdevサーバだけでこの問題がないので、タイムゾーンの問題かもしれないと思うが、Hibernateの新しいバージョンに更新するまでは問題ではなかった。
public List<ResponseDTO> getDashboardData(String date, Integer page, Integer pageSize, AbstractDashboard dashboard) {
List<ResponseDTO> processed = new ArrayList<ResponseDTO>();
String query = getDashboardQuery(date, dashboard);
logger.info("Dashboard Query: " + query);
List<Object[]> raw = createNativeQuery(query).getResultList();
return raw.stream().map(r->new ResponseDTO(r)).collect(Collectors.toList());
}
そして、私のDTOオブジェクトのコンストラクター:
public ResponseDTO(Object[] r) {
this.date = ((Date) r[0]).toLocalDate();
System.out.println(this.date.toString());//This date does not match what is in the db.
this.type = (String) r[1];
this.label = (String) r[2];
this.value = (Double) r[3];
}
編集:
私はそのうちに印刷を試してみましたので、私は、それが実際にjava.sql.Dateタイプの問題だと思います私のdevサーバーとそれはまた、20日の代わりに "2017-04-19"を返します。なぜ私はmysqlコンソールでクエリを実行すると、これは結果と一致しないのですが、私と同じでなければならないようです。
私はそれがあなたのdevサーバとあなたのmysqlサーバの間の時間帯の違いに起因すると思います。 – arturo
@arturo私はあなたが正しいかもしれないと思うが、これは以前は問題ではなかったし、ライブラリを更新したときにのみ問題になったということに私は困惑している。 –