2012-12-27 40 views
1

我有下面的代碼 -如何從Spring獲取最終查詢?

getNamedParameterJdbcTemplate().queryForList("SELECT id FROM emp WHERE age=:age", 
new MapSqlParameterSource("age", 19)) 

我怎樣才能獲得參數替換後發送到MySQL最終查詢?有沒有像 -

getNamedParameterJdbcTemplate(query, paramSource).gimmeTheFinalQuery() 

回答

4

難以置信冗長,但工作溶液是 -

ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement("SELECT id FROM emp WHERE age=:age"); 
SqlParameterSource source = new MapSqlParameterSource("age", 19); 
String finalQuery = new PreparedStatementCreatorFactory(NamedParameterUtils.substituteNamedParameters(parsedSql, 
       source), NamedParameterUtils.buildSqlTypeArray(parsedSql, source)) 
       .newPreparedStatementCreator(NamedParameterUtils.buildValueArray(parsedSql, source, null)) 
       .createPreparedStatement(getConnection()).toString(); 

finalQuery = finalQuery.substring(finalQuery.indexOf(":") + 1, finalQuery.length()); 
System.out.println(finalQuery); 

輸出 -

SELECT ID FROM EMP WHERE年齡= 19

這可以被包裹成一個工具類 -

public class SpringQueryParser { 
    Connection con; 
    public SpringQueryParser(Connection con) { 
     this.con = con; 
    } 
    public String getFinalQuery(String query, SqlParameterSource source) throws SQLException { 
     ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(query); 
     String finalQuery = new PreparedStatementCreatorFactory(NamedParameterUtils.substituteNamedParameters(parsedSql, 
       source), NamedParameterUtils.buildSqlTypeArray(parsedSql, source)) 
       .newPreparedStatementCreator(NamedParameterUtils.buildValueArray(parsedSql, source, null)) 
       .createPreparedStatement(con).toString(); 
     return finalQuery.substring(finalQuery.indexOf(":") + 1, finalQuery.length()).trim(); 
    } 
} 

然後叫方便這樣 -

new SpringQueryParser(getConnection()).getFinalQuery("SELECT id FROM emp WHERE age=:age", 
       new MapSqlParameterSource("age", 19)) 
2

我不認爲有這樣的API在春天,原因是最低的水平可能不會在春季級甚至可用。但是,您可能想看看這個其他問題的答案Simplest way to collect all SQL sent outP6Spy可以很好地完成這項工作,掛鉤到dataSource bean。

0

如果你正在使用Hibernate來顯示SQL statment使用下面的休眠特性:

<prop key="hibernate.show_sql">true</prop> 

如果還使用log4j,則可以將其設置爲通過在log4j屬性文件中設置以下內容來顯示與該語句綁定的參數值:log4j.logger.org.hibernate.type=trace