2013-04-24 145 views
1

我有多個查詢,其中我會做一些任務。重複使用mysql查詢

爲如:

<pre> 
select * from test 
where something 
if check A 
if check B 
if check C 
compare something. 
For one table. 
</pre> 

像明智的,我有不同的表很多其他的查詢。

<pre> 
select * from test 
where something 
if check A 
if check B 
if check C 
compare something. 
</pre> 

currently i am using reference. 

    select * from test 
    where something 

<pre> 
&lt;include refId="test"/&gt; 
</pre> 

<sql id="test"> 
if check A 
if check B 
if check C 
compare something 
</sql> 

有沒有其他更好的方法來做到這一點。並且查詢的返回類型也是哈希映射。

我想知道我們是否可以創建一個函數或方法,我們可以傳遞一些值作爲列或行名稱,然後執行以下操作而不是寫入多個查詢?

更多信息: 實際上,我正在尋找一種方法來編寫查詢一次,並使用它的所有方式,而無需多次輸入,正如我之前告訴過你的,我目前正在使用參考來做到這一點。 但我正在尋找一種方式,我不需要使用不同的選擇語句,然後調用包含標記。相反,我想寫一個函數,我可以將表名或列名從java控制器類傳遞給xml或查詢文件。所以它可以吸收這些值,然後考慮這些輸入並相應地採取行動。

像上面我必須執行或拉起來自不同表格的細節,但條件是幾乎相同的所有查詢。 所以我想創建一個函數,我可以從哪裏發送表中選擇和選擇什麼,然後條件應該是一般的地方,我可以傳遞值,然後它應該爲所有人做wrk。

示例代碼:

<select id="searchPatientAdmissionByDates" resultType="hashMap" parameterType="hashMap"> 
    SELECT COUNT(DISTINCT(admission_details.PATIENT_ID)) AS CASECOUNT 
    FROM admission_details,patient 
    WHERE 
    admission_details.PATIENT_ID = patient.id 
    <if test="admissionDate !=null"> 
     AND 
     FROM_DATE &gt;= #{admissionDate} 
    </if> 
    <if test="admissionDateThru !=null"> 
     AND 
     FROM_DATE &lt;= #{admissionDateThru} 
    </if> 
    <if test="dischargeDate !=null"> 
     AND 
     THRU_DATE &gt;= #{dischargeDate} 
    </if> 
    <if test="dischargeDateThru !=null"> 
     AND 
     THRU_DATE &lt;= #{dischargeDateThru} 
    </if> 
</select> 

這是一個查詢,並具有一定的條件。類似於這個查詢,如果條件不同但有不同的表格,則會有許多查詢。 所以我想創建一個函數,我可以傳遞值,該函數應該爲具有相同條件的查詢操作。

+0

您可以使用大小寫聲明。 – 2013-04-24 09:39:18

+0

Thnx快速回復。 – f1r3wall 2013-04-24 09:39:52

+0

請使用標籤來識別您的編程語言和/或平臺,以便那些可能知道答案的人能夠找到問題。 – 2013-04-24 10:38:55

回答

0

這是我見過很多人試圖解決的問題。

我看到的一般模式是通過檢查一堆對象屬性來動態創建SQL查詢。有點像

UserSearchFilter filter = new UserSearchFlter(). 
filter.setFirstName("John"); 
filter.setJobTitle("CFO"); 

List<User> users = userDao.search(filter); 

的DAO簡單地使用,如果針對每個已知財產語句,如果檢測到,在WHERE子句中相應增加。

這通常適用於一段時間。最終,性能調整變得困難,因爲代碼中有很多路徑。

有時候,一個特定的過濾器不是最好通過where子句完成,而是通過子查詢或內部連接條件完成。有時,當且僅當使用特定的過濾條件時,您需要有條件地加入其他表。有時,您需要使用一個因子來拉出一堆記錄,然後在查詢中加入它們,這可能會更好。

在這種情況下,您希望對每個條件都有單獨的固定查詢。

當然,對於每一次小的一次性的單獨查詢當然可能同樣不利於維護。我一直都在這個方面,在那裏我努力破譯曾經是優雅的代碼,但由於條件的數量以及我在每個小區域擁有相同的SQL而沒有重用的情況下轉換了意大利麪代碼。

與生活中的大多數事物一樣,您可以打擊健康的平衡。

+0

感謝您的回覆,我希望截至目前,我可以繼續參考,並嘗試調用它,以便我需要使用這些條件。 – f1r3wall 2013-04-24 13:45:13

+0

您可能可以重複使用一些查詢。不要害怕去做。只要注意不要讓代碼如此靈活以致難以維護。 – Brandon 2013-04-24 14:05:02

+0

感謝您的建議,請牢記:) – f1r3wall 2013-04-26 07:28:24