【问题标题】:Best ways to construct Dynamic Search Conditions for Sql为Sql构造动态搜索条件的最佳方法
【发布时间】:2010-04-02 19:28:09
【问题描述】:

我一直想知道完成这项任务的最佳方法是什么。在大多数基于 Web 的应用程序中,您必须根据许多不同的标准提供搜索选项。根据在幕后选择的标准,您可以修改 SQL。一般来说,我倾向于这样做:-

  1. 有一个基本的 SQL 模板。

  2. 在基本模板中有类似这样的条件 WHERE [#PRE_COND1] AND [#PRE_COND2] .. 以此类推。因此,示例 SQL 可能类似于 SELECT NAME,AGE FROM PERSONS [,#TABLE2] [,#TABLE3] WHERE [#PRE_COND1] AND [#PRE_COND2] ORDER BY [#ORD_COND1] AND [#ORD_COND2] 等。

  3. 在确定用户输入的所有搜索条件后的运行期间,我将 [#PRE_COND1] 和 [#ORD_COND1] 替换为适当的 SQL,然后执行查询。

我个人不喜欢这种蛮力方法。但是,我也从未遇到过更好的方法。考虑到您使用的是原生 JDBC 还是 Spring JDBC,通常如何完成这些任务?

这几乎就像我需要一个类似于 Java 中的 C 宏的功能来执行此操作。

【问题讨论】:

    标签: java oop coding-style


    【解决方案1】:

    对于 java,我使用 SqlBuilder(类似于直接 JDBC 的 Hibernate Criteria API)。当然,我是有偏见的。 :)

    【讨论】:

      【解决方案2】:

      如果您使用的是 Hibernate,Criteria API 在这方面表现出色。如果没有,我猜有人已经为纯 SQL 编写了一些类似的 API

      我记得 H2 的人有一些链接,请参阅此处 Similar Projects,其中一些工具可能是您需要的。

      【讨论】:

      • Criteria API 的问题是,对于复杂的动态查询,它成为开发和维护的噩梦。
      【解决方案3】:

      通过搜索,检索到的列通常是固定的:通常where 子句是变化的。

      我倾向于使用

      select ... from ...
      where true
      

      作为基础,并根据需要使用and column = value 标准扩展 where 子句。排序是这一原则的简单扩展。

      这种方法也适用于休眠查询语言。

      【讨论】:

      • 这和我现在做的很相似。我一直在寻找不同的东西。我还尝试删除与某些搜索不相关的表,以提高查询效率,因此我也动态替换了表名。很多时候,对于其他人确实需要的某些条件,您有内部联接。
      • 我明白你的意思。我不认为我的方法有很大不同。一般来说,我只看到两种可能性:做你现在正在做的事情,或者使用像 Criteria API 之类的东西(正如 Raticulin 所建议的那样),它基本上为你提供了一个围绕 SQL 段的包装器来创建新的抽象。
      【解决方案4】:

      ibatis 非常适合创建动态 sql。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-13
        相关资源
        最近更新 更多