【问题标题】:Comparisons of Oracle DATE column with java.sql.timestamp via JOOQ通过 JOOQ 比较 Oracle DATE 列与 java.sql.timestamp
【发布时间】:2012-11-30 20:09:30
【问题描述】:

我正在使用 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 进行日期查询的问题(尽管这是前一阵子)。我做错了什么?

【问题讨论】:

    标签: oracle date jooq


    【解决方案1】:

    我怀疑这个问题是由于create.fieldByName() 不知道列的类型(因此是对象),并在比较谓词的右侧强制使用该未知类型。这应该在 jOOQ 中修复。我为此注册了#2007: https://github.com/jOOQ/jOOQ/issues/2007

    同时,尝试在您的字段上明确设置类型:

    create.fieldByName(Timestamp.class, "TEST_COLUMN").lessThan(now)
    

    【讨论】:

      猜你喜欢
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 1970-01-01
      • 2017-10-08
      • 1970-01-01
      • 2010-12-29
      相关资源
      最近更新 更多