Java mysql查询的重用
我有多个查询,其中我将执行一些任务 例如:Java mysql查询的重用,java,mysql,Java,Mysql,我有多个查询,其中我将执行一些任务 例如: <pre> select * from test where something if check A if check B if check C compare something. For one table. </pre> <select id="searchPatientAdmissionByDates" resultType="hashMap" parameterType="hashMap">
<pre>
select * from test
where something
if check A
if check B
if check C
compare something.
For one table.
</pre>
<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 >= #{admissionDate}
</if>
<if test="admissionDateThru !=null">
AND
FROM_DATE <= #{admissionDateThru}
</if>
<if test="dischargeDate !=null">
AND
THRU_DATE >= #{dischargeDate}
</if>
<if test="dischargeDateThru !=null">
AND
THRU_DATE <= #{dischargeDateThru}
</if>
</select>
像wise一样,我对不同的表有许多其他查询
还有其他更好的方法吗。查询的返回类型也是一个哈希映射
我想知道我们是否可以创建一个函数或方法,在其中我们可以将一些值作为列名或行名传递,然后执行以下操作,而不是编写多个查询
更多信息:
实际上,我正在寻找一种方法来编写一个查询,一次使用它,而不必多次输入它,正如我之前告诉你的那样,我目前正在使用引用来实现这一点。
但是我正在寻找一种不需要使用不同的select语句然后调用include标记的方法。相反,我想编写一个函数,在这个函数中,我可以将表名或列名从java控制器类传递到xml或查询文件。因此,它可以摄取值,然后考虑这些输入并相应地采取行动。
像上面一样,我必须从不同的表中执行或提取细节,但在所有查询中条件几乎相同。
所以我想创建一个函数,在这里我可以发送表,从哪里选择,选择什么,然后条件应该是通用的,在这里我可以传递值,然后它应该为所有人做wrk
示例代码:
这是一个查询,有一些条件。与此查询类似,有许多具有相同if条件但不同表的查询。
所以我想创建一个函数,在这里我可以传递值,这个函数应该对所有具有相同条件的查询进行操作 这是我见过很多人试图解决的问题 我看到的一般模式是通过检查一组对象属性来动态创建SQL查询。有点像 DAO只对每个已知属性使用if语句,如果检测到,则相应地添加WHERE子句 这通常在一段时间内效果良好。最终,性能调优变得很困难,因为代码中有太多路径 有时,一个特定的过滤器最好不是通过where子句完成的,而是通过一个子查询或内部连接条件完成的。有时,当且仅当使用特定的筛选条件时,才需要有条件地联接其他表。有时,您需要使用WITH因子来提取一组记录,然后在稍后的查询中加入它们,这样可能会执行得更好 在这种情况下,您希望对每个条件都有一个单独的固定查询 当然,现在每一个单独的查询都会对维护造成同样的影响。我在这两个方面都做过,我努力破译过去是优雅的代码,但由于条件的数量太多而变成了意大利面代码,在每个小地方我都有相同的SQL,没有重复使用
就像生活中的大多数事情一样,你可以找到一个健康的平衡。你可以使用case statement.Thnx来快速回答。请使用标记来识别你的编程语言和/或平台,以便知道答案的人能够找到问题。谢谢你的回答,我希望到目前为止,我可以继续使用引用,并尝试在需要使用这些条件的地方调用它。您可以重用一些查询。不要害怕去做。只是要小心,不要让代码变得如此灵活,以至于难以维护。
<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 >= #{admissionDate}
</if>
<if test="admissionDateThru !=null">
AND
FROM_DATE <= #{admissionDateThru}
</if>
<if test="dischargeDate !=null">
AND
THRU_DATE >= #{dischargeDate}
</if>
<if test="dischargeDateThru !=null">
AND
THRU_DATE <= #{dischargeDateThru}
</if>
</select>
UserSearchFilter filter = new UserSearchFlter().
filter.setFirstName("John");
filter.setJobTitle("CFO");
List<User> users = userDao.search(filter);