2011-02-16 24 views
0

我有一個自定義的Java查詢引擎,它可以生成一串SQL(包含?作爲數據佔位符)以及包含要綁定到佔位符的數據的對象列表。然後將其傳遞給JDBCTemplate.queryForList(sql,bindings.toArray())API以生成結果集。將SQL和綁定數據轉換爲直接SQL

這工作正常,但我也需要在子查詢中使用此SQL,並不能找出一個(簡單的方法)從此轉換爲直接SQL(使用Java類型和數據庫友好格式之間的適當數據庫轉換等)。

是否有工具可以做到這一點?

+0

我不明白這個問題。所以你有一個像這樣的SQL:`select name from names where id =?`。你想使用它作爲一個子查詢的含義 - 「選擇a.name,b.age從(選擇名稱,其中id =?)作爲一個,年齡b`和a.id = b.id? – CoolBeans 2011-02-16 01:32:13

+0

我有「從名稱選擇名稱,其中id =?」和列表與Integer(1),並希望「從名稱選擇名稱,其中id = 1。問題是我的選擇stmt和列表是複雜的不同類型,等我認爲只是做我自己的查找/替換,但似乎很難擔心類型映射... – 2011-02-16 01:44:07

回答

1

你可能想看看下面的工具。
http://commons.apache.org/dbutils/

儘管這不會直接回答您的問題,但它在將來可能會有用。我也碰到過這個問題,並且我設計了一種方法,雖然不是最好的,但對我有用。我創建了一個方法,可以按照您的建議自動填充參數中的值,但它不會以類型安全的方式進行填充。不管怎麼說,也許你可以採取的方法和改進它,如果你決定使用它:

public static String preparedQueryString(String staticQuery, Object... parameters) { 
    for(Object curParameter : parameters) { 
     if(curParameter instanceof String) { 
      staticQuery = staticQuery.replaceFirst("\\?", "'" + curParameter.toString() + "'"); 
     } else { 
      staticQuery = staticQuery.replaceFirst("\\?", curParameter.toString()); 
     } 

    return staticQuery; 
} 

您可能還需要添加代碼,以確保參數的數量不超過問號的數量你也可能想讓java類型更適合你使用的數據庫。我使用它來輸出PreparedStatement的SQL,因爲PreparedStatement沒有任何好的功能,可以在設置適當的參數後刪除完成的SQL查詢。

希望這會有所幫助,