当我们使用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.
除了大多数数据库都具有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()您的驱动程序的结果.
| 归档时间: |
|
| 查看次数: |
813 次 |
| 最近记录: |