1

jooq を使用して Oracle のクエリを作成しています。日付以外はすべて正常に機能します。

public static void main(String[] args) throws SQLException {
    java.sql.Timestamp now = new java.sql.Timestamp(new Date().getTime());
    Connection con = DriverManager.getConnection(... , ... , ...);
    final Factory create = new OracleFactory(con);
    Statement s = con.createStatement();
    s.execute("create table test_table ( test_column DATE )");
    s.execute("insert into test_table values (to_date('20111111', 'yyyymmdd'))");

    // -- using to_date
    ResultSet rs = s.executeQuery("select count(1) from test_table where test_column<to_date('20121212', 'yyyymmdd')");
    rs.next();
    System.out.println(""+rs.getInt(1));
    rs.close();     

    // -- using a preparedstatement with java.sql.timestamp
    PreparedStatement ps = con.prepareStatement("select count(1) from test_table where test_column<?");
    ps.setTimestamp(1,now);
    rs = ps.executeQuery();
    rs.next();
    System.out.println(""+rs.getInt(1));
    rs.close();

    // -- using jooq with java.sql.timestamp
    final org.jooq.Table<org.jooq.Record> table = create.tableByName("TEST_TABLE");
    final org.jooq.SelectSelectStep sss = create.select(create.count());
    final org.jooq.SelectJoinStep sjs = sss.from(table);
    final org.jooq.SelectConditionStep scs = sjs.where(create.fieldByName("TEST_COLUMN").lessThan(now));
    System.out.println(scs.toString());
    rs = s.executeQuery(scs.toString());
    rs.next();
    System.out.println(""+rs.getInt(1));
    rs.close();

    s.close();

}

次の出力が得られます。

   1
   1
   select count(*) from "TEST_TABLE" where "TEST_COLUMN" < '2012-12-12 19:42:34.957'
   Exception in thread "main" java.sql.SQLDataException: ORA-01861: literal does not match format string

JOOQ は、lessThan(Object) で Object の型をチェックして、適切な変換ができるかどうかを判断すると思っていましたが、この場合は Object.toString() を実行するだけのようです。また、MySQL の JOOQ を介した日付クエリで問題が発生したことは一度もありません (これは少し前のことですが)。私は何を間違っていますか?

4

1 に答える 1

1

この問題はcreate.fieldByName()、列のタイプ(したがって、オブジェクト)がわからないという事実が原因であると思われ、比較述語の右側でその不明なタイプを強制します。これはjOOQで修正する必要があります。私はこれに#2007を登録しました: https ://github.com/jOOQ/jOOQ/issues/2007

それまでの間、フィールドにタイプを明示的に設定してみてください。

create.fieldByName(Timestamp.class, "TEST_COLUMN").lessThan(now)
于 2012-12-13T07:59:23.517 に答える