2

postgres dbで、jOOQを使用して、次のように定義された列を持つ行をフェッチすると

timestamp without time zone

select を実行して値を取得すると (jOOQ によって にフェッチされますjava.sql.Timestamp)、ナノ秒が欠落していることがわかります。

たとえば、私が持っているデータベースでは:

2016-04-04 15:14:10.970048

しかし、jOOQ は値を含むタイムスタンプを返します

2016-04-04 15:14:10.0

これは、さらなる比較の問題です。どうすればこれを防ぐことができますか?


更新 リクエストに応じて、詳細を提供します。

Postgresql には次のタイプがあります。

CREATE TYPE schema.my_type AS
(
  mt_page                  smallint,
  mt_active_from   timestamp without time zone,
);

ルーチンを使用して、関数を呼び出します。

DSLContext dsl = ....

MyTypeRecord [] records = Routines.myRoutine(dsl.configuration); 

次に、タイムスタンプにはナノがありません

機能は次のとおりです。

CREATE OR REPLACE FUNCTION shop.myRoutine(
  OUT my_types schema.my_type[]
  )
  RETURNS schema.my_type[] AS
$BODY$
DECLARE
BEGIN
  BEGIN

          SELECT ARRAY(
            SELECT
                  ROW(a_id, a_timestamp)::schema.my_type
            FROM schema.article
          ) INTO my_types;
  END;
  RETURN;
END;
$BODY$
LANGUAGE plpgsql VOLATILE SECURITY DEFINER
COST 1000;
4

1 に答える 1

1

これは jOOQ のバグです: https://github.com/jOOQ/jOOQ/issues/5193

残念ながら、PostgreSQL の JDBC ドライバーはSQLDataすぐに使用できる複合型サポート用の関連 API を実装していないため、jOOQ は複合型デシリアライゼーション アルゴリズムを内部的に実装しています。現在の実装 (jOOQ 3.7.3) は、秒の小数部分なしでタイムスタンプを解析します。

回避策として、独自のデータ型バインディングを実装して、この問題を回避できます。

于 2016-04-06T13:14:21.780 に答える