2015-05-28 8 views
5

sto passando un parametro ad un PreparedStatement come questo:Riutilizzare un parametro in PreparedStatement?

public void getNodes(String runId, File file, Connection conn) { 
    PreparedStatement ps = null; 
    ResultSet rs = null; 
    try { 
     ps = conn.prepareStatement(Mat.queries.get("NettingNode.QUERY")); 

     ps.setString(1, runId); 
     ps.setFetchSize(10000); 
     rs = ps.executeQuery(); 

     // etc. 
    } catch (Exception e) { 
     logger.error(e, e); 
    } finally { 
     close(rs, ps); 
    } 
} 

e la query si presenta così:

select * from table_1 where run_id = ? 

Ora voglio modificare la mia domanda come questa, e riutilizzare il primo parametro (sia ? avrebbe usato il parametro RunID):

select * from table_1 where run_id = ? 
union 
select * from table_2 where run_id = ? 

che è possibile, senza fare questo:

ps.setString(1, runId); 
ps.setString(2, runId); 
+0

Off-topic: In caso di C/C++ è possibile. Funzioni OCIDefineByPos, OCIDefineByName si comportano come previsto. Penso che in caso di JDBC questa funzionalità sia stata sacrificata per essere compatibile con i database, che non la supportano. Quindi forse i driver Oracle JDBC hanno qualche estensione proprietaria per questo. – ibre5041

risposta

8

Questo non può essere eseguito con JDBC normale. Si potrebbe invece utilizzare JDBCTemplate di Spring, che supporterà ciò che si desidera con i parametri nominati e riutilizzerà lo stesso nome ovunque sia necessario nell'istruzione.

Vedi Named parameters in JDBC