Olá,
Eu acredito que o contrato do PreparedStatement não diz que o retorno do método toString() tem que ser um SQL válido. Porque é que você quer executar o SQL por fora do PreparedStatement?
Veja só a descrição do método Connection.prepareStatement:
A SQL statement with or without IN parameters can be pre-compiled and stored in a PreparedStatement object. This object can then be used to efficiently execute this statement multiple times.
Note: This method is optimized for handling parametric SQL statements that benefit from precompilation. If the driver supports precompilation, the method prepareStatement will send the statement to the database for precompilation. Some drivers may not support precompilation. In this case, the statement may not be sent to the database until the PreparedStatement object is executed. This has no direct effect on users; however, it does affect which methods throw certain SQLException objects.
Eu não conheço o PostGreSQL intimamente, mas o Oracle por exemplo, o driver nunca constroi um SQL do jeito que você está pensando. Quando você faz um
PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM pessoa WHERE fulano=?");
pstmt.setString(1, "Sami");
pstmt.executeQuery();
O driver não cria um “SELECT * FROM pessoa WHERE fulano=‘Sami’”. Ele primeiro manda o “SELECT * FROM pessoa WHERE fulano=?” para o banco e depois quando você executa o .executeQuery, ele só diz pro banco que ele quer utilizar o valor “Sami” no lugar do ?.
Então acho que se o driver do PostGreSQL mostra o SQL mais ou menos dando um toString() já é muito. Mesmo se ele colocasse as aspas, você teria a bagunça toda de tratar os variaveis caso eles contem aspas simples, quebra de linha, etc, para que o SQL virasse válido. O PreparedStatement faz tudo isso para você.
[]s,
Sami