使用JDBC的"通用"当前时间函数

dic*_*c19 2 java jpa jdbc

当我们使用JPA和JPQL时,我们可以使用一些日期/时间表达式来使查询DMBS独立.例如,假设我想在数据库中设置会话的结束时间,我可以简单地使用CURRENT_TIMESTAMP表达式,如下所示:

String jpql = "UPDATE SessionJpa s SET s.end = CURRENT_TIMESTAMP WHERE s.id = :id";

entityManager.getTransaction().begin();
Query query = entityManager.createQuery(jpql);
            query.setParameter("id", someIdValue);
            query.executeUpdate();
entityManager.getTransaction().commit();
Run Code Online (Sandbox Code Playgroud)

这样,相同的JPQL应该与Oracle,MySQL,PostreSQL等一起用作DBMS.

现在我的问题是:在使用JDBC而不是JPA时,有没有办法实现相同的目标?

这是我到目前为止:

String sql = "UPDATE Sessions SET end = SYSDATE WHERE id = ?";

try (Connection connection = dataSource.getConnection();
    PreparedStatement statement = connection.prepareStatement(sql)) {

        statement.setLong(1, someIdValue);
        int updatedRows = statement.executeUpdate();

} catch(SQLException ex) {
    Logger.getLogger(SessionsBean.class.getName()).log(Level.SEVERE, null, ex);
}
Run Code Online (Sandbox Code Playgroud)

但当然SYSDATE不是通用表达式,它最有可能只作为DBMS使用Oracle.

Mar*_*eel 5

除了大多数数据库都具有SQL标准之外CURRENT_TIMESTAMP,JDBC驱动程序可能支持JDBC转义函数并将它们转换为特定于数据库的变体.这些转义被称为使用{fn <function>},并列在JDBC 4.2规范的附录C中.

具体来说(来自C.3):

CURRENT_DATE[()]同义词CURDATE()
CURRENT_TIME[()]同义词的CURTIME()
CURRENT_TIMESTAMP[()]同义词NOW()
CURDATE()当前日期作为日期值
CURTIME()当前本地时间作为
NOW()时间值表示当前日期和时间的时间戳值

所以JDBC escape等价物是:

String sql = "UPDATE Sessions SET end = {fn CURRENT_TIMESTAMP} WHERE id = ?";
Run Code Online (Sandbox Code Playgroud)

(或{fn NOW()})

请注意,虽然JDBC驱动程序需要支持转义语法,但它们实际上并不需要支持所有函数.检查DatabaseMetaData.getTimeDateFunctions()您的驱动程序的结果.