1

我有多个查询,其中我会做一些任务。

例如:

<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>

这是一个查询,有一些条件。与此查询类似,有许多具有相同 if 条件但表不同的查询。所以我想创建一个函数,我可以在其中传递值,并且该函数应该适用于具有相同条件的所有查询。

4

1 回答 1

0

这是我看到很多人试图解决的问题。

我见过的一般模式是通过检查一堆对象属性来动态创建 SQL 查询。有点像

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

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

DAO 只对每个已知属性使用 if 语句,如果检测到,则相应地添加 WHERE 子句。

这通常会在一段时间内运作良好。最终,性能调优变得很困难,因为代码中有太多路径。

有时,最好不要通过 where 子句,而是通过子查询或内部连接条件来完成特定的过滤器。有时,当且仅当使用特定过滤条件时,您才需要有条件地连接其他表。有时,您需要使用一个WITH因子来提取一堆记录,然后在稍后的查询中加入它们,这样可能会执行得更好。

在这种情况下,您会希望对每个条件都有一个单独的固定查询。

当然,现在,对每一个小一次性的单独查询可能同样不利于维护。我一直在这两个方面,我努力破译过去优雅的代码,但由于条件的数量而变成了意大利面条代码,而且我在每个小区域都有相同的 SQL,没有重复使用。

就像生活中的大多数事情一样,你可以达到一个健康的平衡。

于 2013-04-24T12:07:31.327 回答