有一种方法可以获得JBoss 6/7的OraclePreparedStatement内容吗?

时间:2015-07-22 08:16:48

标签: java oracle jdbc jboss

如何在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 { ...

2 个答案:

答案 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