我有多个查询,其中我将执行一些任务。
表示例如:
<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>
<include refId="test"/>
</pre>
<sql id="test">
if check A
if check B
if check C
compare something
</sql>
还有其他更好的方法吗?并且查询的返回类型是哈希映射。
我想知道我们是否可以创建一个函数或方法,我们可以将一些值作为列或行名称传递,然后执行以下操作而不是编写多个查询?
更多信息: 实际上我正在寻找一种方法来编写一次查询并一直使用它而不必多次输入,正如我之前告诉你的那样,我现在正在使用引用来做到这一点。 但我正在寻找一种方式,我不需要使用不同的选择语句,然后调用包含标签。相反,我想编写一个函数,我可以将表名或列名从java控制器类传递给xml或查询文件。所以它可以吸收价值,然后考虑那些输入并相应地采取行动。
像上面一样,我必须执行或从不同的表中提取细节,但所有查询中的条件几乎相同。 所以我想创建一个函数,我可以发送表从哪里选择和选择什么,然后条件应该是一般我可以传递值,然后它应该为所有人做wrk。示例COde:
<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>
这是一个查询并且有一些条件。类似于此查询,有许多查询具有相同的if条件但不同的表。 所以我想创建一个函数,我可以传递值,该函数应该对具有相同条件的查询进行操作。
答案 0 :(得分:0)
这是我见过许多人试图解决的问题。
我看到的一般模式是通过检查一堆对象属性来动态创建SQL查询。有点像
UserSearchFilter filter = new UserSearchFlter().
filter.setFirstName("John");
filter.setJobTitle("CFO");
List<User> users = userDao.search(filter);
DAO只对每个已知属性使用if语句,如果检测到,则相应地添加一个WHERE子句。
这通常适用一段时间。最终,性能调整变得困难,因为代码中有很多路径。
有时,特定的过滤器不是最好通过where子句完成的,而是通过子查询或内部连接条件完成的。有时,当且仅当使用特定过滤条件时,您需要有条件地连接其他表。有时,您需要使用WITH
因子来提取一堆记录,然后在查询中加入它们,这可能会表现得更好。
在这种情况下,您希望每个条件都有单独的固定查询。
现在,当然,对于每一个小的一次性的单独查询可能同样不利于维护。我一直在这两个方面,在那里我试图破译过去优雅的代码,但由于条件的数量和我在每个小区域都有相同的SQL而没有重复使用的情况下转为意大利面条代码。
像生活中的大多数事情一样,你可以有一个健康的平衡。