文字列として生のSQLを取得することは難しいですが、log4jdbcを使うと簡単にログファイルやコンソールに生のSQLを出力でき、当方でも使っています。mavenプロジェクトにすると設定が楽です。
pom.xml:
xml
1		<dependency>
2			<groupId>org.apache.logging.log4j</groupId>
3			<artifactId>log4j-slf4j-impl</artifactId>
4			<version>${log4j.version}</version>
5		</dependency>
6		<dependency>
7			<groupId>org.apache.logging.log4j</groupId>
8			<artifactId>log4j-core</artifactId>
9			<version>${log4j.version}</version>
10		</dependency>
11
12		<!-- https://mvnrepository.com/artifact/com.googlecode.log4jdbc/log4jdbc -->
13		<dependency>
14			<groupId>com.googlecode.log4jdbc</groupId>
15			<artifactId>log4jdbc</artifactId>
16			<version>1.2</version>
17		</dependency>
log4j2.xml
XML
1   <Loggers>
2    <Root level="trace">
3      <AppenderRef ref="console" level="info"/>
4      <AppenderRef ref="file" level="info" />
5    </Root>
6
7     <!-- log4jdbcによるJDBC自動ログ出力の設定 -->
8      <!-- log4jdbcの詳細設定は log4jdbc.properties -->
9
10      <!-- コネクションの確立/切断 -->
11      <logger name="jdbc.connection" additivity="false" level="off" />
12      <!-- ResultSet に関する呼び出しを除く全ての JDBC の呼び出し -->
13      <logger name="jdbc.audit" additivity="false" level="off" />
14      <!-- ResultSet に関する呼び出し -->
15      <logger name="jdbc.resultset" additivity="false" level="off" />
16      <!-- SQL が実行される直前 -->
17      <logger name="jdbc.sqltiming" additivity="false" level="off" />
18      <!-- 実行される SQL -->
19      <logger name="jdbc.sqlonly" additivity="true" level="info" />
20      <!-- log4jdbc 自身のデバッグメッセージ -->
21      <logger name="jdbc.debug" additivity="false" level="off" />
22   </Loggers>
Java
1	    Class.forName("net.sf.log4jdbc.DriverSpy");
2	    connection = DriverManager.getConnection("jdbc:log4jdbc:oracle:thin:@localhost:1521", user, password);
3PreparedStatement select = null;
4
5            // 例:
6	    select = connection.prepareStatement(
7		    "select nvl(INSTRUCTOR_NAME, NAME) from ON_THE_JOB j"
8		    + "  left join INSTRUCTOR i on j.INDICATED_BY = i.INSTRUCTOR_ID"
9		    + "  left join FRESH_PERSON f on j.MODIFIED_BY = f.EMP_CODE"
10		    + "  where PHASE_NO = ? and EXERCISE_NO = ? and TARGET_NO = ? and TEAM = ? and j.LDF = 0"
11		    + "    and (INDICATED_BY is not null or MODIFIED_BY is not null)"
12	    );
13
14	    select.setInt(1, target.getPhaseNo());
15	    select.setInt(2, target.getExerciseNo());
16	    select.setInt(3, target.getTargetNo());
17	    select.setString(4, target.getTeam());
18	    ResultSet rs = select.executeQuery();
ログ出力例:
2019-10-12 15:42:22.445 | [http-nio-8090-exec-2] | INFO  | jdbc.sqlonly | select nvl(INSTRUCTOR_NAME, NAME) from ON_THE_JOB j left join INSTRUCTOR i on j.INDICATED_BY
= i.INSTRUCTOR_ID left join FRESH_PERSON f on j.MODIFIED_BY = f.EMP_CODE where PHASE_NO = 4
and EXERCISE_NO = 0 and TARGET_NO = 16 and TEAM = 'A' and j.LDF = 0 and (INDICATED_BY is not
null or MODIFIED_BY is not null)