2013-04-24 174 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