Tho*_*sen 10
正如我在我的博客中更详细地解释的那样,您可以使用ReturningWork和 Work 接口来实现任何需要直接访问java.sql.ConnectionHibernate 会话所使用的 的逻辑。
这是一个简单的示例,它使用该ReturningWork接口执行一个非常简单的查询(您也可以使用JPQL实现)并返回结果。
Session session = em.unwrap(Session.class);
Integer bookCount = session.doReturningWork(new ReturningWork<Integer>() {
@Override
public Integer execute(Connection con) throws SQLException {
// do something useful
try (PreparedStatement stmt = con.prepareStatement("SELECT count(b.id) FROM Book b")) {
ResultSet rs = stmt.executeQuery();
rs.next();
return rs.getInt(1);
}
}
});
log.info("Found " + bookCount + " books.");
Run Code Online (Sandbox Code Playgroud)
Vla*_*cea 10
Session doReturningWorkHibernateSession doReturningWork方法具有以下签名:
<T> T doReturningWork(ReturningWork<T> work) throws HibernateException;
Run Code Online (Sandbox Code Playgroud)
而ReturningWork界面如下所示:
public interface ReturningWork<T> {
public T execute(Connection connection) throws SQLException;
}
Run Code Online (Sandbox Code Playgroud)
因此,与doWork方法不同,doReturningWork允许我们将对象返回给方法调用者。
例如,我们可以使用该doReturningWork方法来获取当前的事务隔离级别:
Session session = entityManager.unwrap(Session.class);
int isolationLevel = session.doReturningWork(
connection -> connection.getTransactionIsolation()
);
assertEquals(
Connection.TRANSACTION_READ_COMMITTED,
isolationLevel
);
Run Code Online (Sandbox Code Playgroud)
doWork和doReturningWork?通常,您可以使用 JPA 或 Hibernate 特定的 API 来执行 SQL 语句或调用数据库过程或函数。
但是,如果要访问底层 JDBCConnection方法并通过 JDBC API 执行任何可能的操作,则需要使用doWork和doReturningWorkHibernateSession方法。
| 归档时间: |
|
| 查看次数: |
1180 次 |
| 最近记录: |