【问题标题】:Storing search criteria in a database在数据库中存储搜索条件
【发布时间】:2010-11-11 06:01:14
【问题描述】:

我正在对 Flex 仪表板进行增强,以允许用户保存搜索。我在服务器端使用 BlazeDS 和 Java/Spring/SpringJdbc。

我的问题是:您将如何为具有一个或多个条件的搜索建模,例如:

  • 起息日在 2009-10-01 和 2009-10-31 之间
  • 货币 = '美元'
  • 银行名称以“First”开头

我的第一个尝试是将标准分为 3 种类型:

  • 数字标准
  • 日期标准
  • 字符串条件

每种标准类型都有一组不同的比较运算符:

  • 数字运算符:=、>、>=、
  • 日期运算符:之前、之后、之间
  • 字符串运算符:开始于、结束于、包含

我有代码来识别这些运算符中的每一个。

我的对象模型是一个 SearchCriteria 接口和 3 个实现它的类:NumericCriteria、DateCriteria 和 StringCriteria

所有这些类都映射到具有以下列的同一个表:

 - SAVED_SEARCH_ID: id of the saved search
 - SEQ_NUM: criteria order. We want to load the criteria in the same order each time
 - CRITERIA_TYPE: Operator code. I can use this later to determine what kind of criteria this is.
 - FIELD: currency, valueDate, bank, etc
 - FIRST_VALUE_NUMERIC
 - SECOND_VALUE_NUMERIC
 - FIRST_VALUE_DATE
 - SECOND_VALUE_DATE
 - FIRST_VALUE_STRING
 - SECOND_VALUE_STRING

有没有更清洁的方法来做到这一点?我对数据模型并不疯狂,但我找不到关于这个主题的任何资源......无论多么残忍,所有的 cmets 都受到赞赏:)

【问题讨论】:

    标签: java database-design


    【解决方案1】:

    您可以将您的标准类序列化为 XML 并将 XML 持久化以代替实现庞大的架构。

    【讨论】:

      【解决方案2】:

      也许您可以从Hibernate Criteria API 中获得一些灵感。它为类型安全查询提供了一个完整的模型,它本身可能会使用 JPA/Hibernate 本身映射到数据库中。

      【讨论】:

        【解决方案3】:

        以 SQL 格式本身存储整个搜索条件有什么害处吗?不确定要考虑您提到的方法的其他参数是什么。

        【讨论】:

        • 嗯,将 SQL 存储在数据库中的主要问题是,必须以这样一种方式解析 SQL,以便 Flex 客户端可以在用户检索时使用它来重新显示条件已保存的搜索。
        【解决方案4】:

        如果您使用 JDBC,您可以将 SQL 语句存储为字符串(或者可能只存储 where 子句)。每次运行时都需要准备查询,如果您的查询量非常大,这可能是一个问题。但这听起来比尝试将 where 子句分解为组成标记要容易得多。

        如果您采用这种方法,请务必小心防范 SQL 注入攻击(在查询中放置的不仅仅是 where 子句——比如 DROP TABLE)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-06-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-16
          • 2011-12-02
          相关资源
          最近更新 更多