如何在JBoss上访问OraclePreparedStatement?
我从JBoss那里得到一个org.jboss.jca.adapters.jdbc.jdk6.WrappedPreparedStatementJDK6。我打电话给#34; getUnderlyingStatement"来自它的方法,并返回一个" OraclePreparedStatementWrapper" (Oracle驱动程序内部类)。
我发现这个post有一个"解决方案"但在我们的案例中不起作用。访问内部字段" preparedStatement"这些类返回一个" oracle.jdbc.driver.T4CPreparedStatement"类。
我们的实际代码:
} else if (st.getClass().getName().equals ("org.jboss.jca.adapters.jdbc.jdk6.WrappedPreparedStatementJDK6")) {
try {
Class jbossWrappedSt = Class.forName("org.jboss.jca.adapters.jdbc.jdk6.WrappedPreparedStatementJDK6");
Method metodoUnwrap = jbossWrappedSt.getMethod ("getUnderlyingStatement");
Object val = metodoUnwrap.invoke (st);
Field preparedStatementField = val.getClass ().getDeclaredField ("preparedStatement");
preparedStatementField.setAccessible (true);
return ((PreparedStatement)preparedStatementField.get(val)); // Returns a "if (st.getClass().getName().equals ("org.jboss.jca.adapters.jdbc.jdk6.WrappedPreparedStatementJDK6")) {
try {
Class jbossWrappedSt = Class.forName("org.jboss.jca.adapters.jdbc.jdk6.WrappedPreparedStatementJDK6");
Method metodoUnwrap = jbossWrappedSt.getMethod ("getUnderlyingStatement");
Object val = metodoUnwrap.invoke (st);
Field preparedStatementField = val.getClass ().getDeclaredField ("preparedStatement");
preparedStatementField.setAccessible (true);
return getOraclePreparedStatement ((PreparedStatement)preparedStatementField.get(val));
} catch (Throwable e) {
throw new ConfigException ("En getOraclePreparedStatement, error al intentar acceder a la conexión Oracle del pool de conexiones JBoss", e);
}
} else { ...
答案 0 :(得分:0)
您可以通过
访问java.sql.Connection
Session session = entityManager.unwrap(Session.class);
SessionFactoryImplementor sfi = (SessionFactoryImplementor) session.getSessionFactory();
ConnectionProvider cp = sfi.getConnectionProvider();
Connection con = cp.getConnection();
从那里,您可以使用PreparedStatement
Connection#prepareStatement()
现在,有些人声称您可以将退回的PreparedStatement
投放到OraclePreparedStatement
。
无论如何,为什么你需要OraclePreparedStatement
,也许你可以实现你的目标呢?
答案 1 :(得分:0)
看起来没有办法做到这一点,而是我们结束了一个方法,使用Java反射来调用setFormOfUse而不是OraclePreparedStatementWrapper