【问题标题】:Is there a Design Pattern for implementing a parametric search feature w/o using SQL in Java?是否有用于在 Java 中使用 SQL 实现参数搜索功能的设计模式?
【发布时间】:2009-09-11 23:18:08
【问题描述】:

我不太确定设计我称之为“参数”搜索或规则引擎的最佳方法是什么。我有一个包含多个字段的 Java 对象。我将针对几个查询运行 java 对象,以查看它是否符合某些条件。

我能想到的一个例子是 bugzilla 中的错误搜索功能。在 UI 中,您可以选择状态、分辨率、严重性等内容。然后点击 go,它会返回符合该条件的错误。我想这是通过从 UI 中选择的字段生成 SQL 查询来实现的。

在我的例子中,包含值的对象不在数据库中,所以这不是显而易见的答案。我的对象也相当复杂,需要添加多个表......而且创建数据库表然后使用数据库中的查询引擎似乎有点骇人听闻。此外,在我的应用程序中,用户基本上创建了这些映射,并且需要将它们保存到数据库中。因此,在这种情况下,您最终会将原始 sql 查询字符串保存到数据库中,这对我来说听起来像是一个严重的安全问题。 (但是,我不是数据库专家,所以也许这就是事情的完成方式)。

在这一点上,我真的在寻找一些指导。我希望我想要完成的事情有某种类型的设计模式。我尝试在谷歌上搜索“参数搜索设计模式”和“规则引擎”等各种内容,但没有找到任何相关的内容。这是 LINQ 会解决的问题吗?我简单地看了看它,似乎这也太过分了。

提前致谢。

编辑 1:
以下是一些额外的细节,我希望这些细节能够澄清迄今为止​​的 cmets。 我想让用户创建一些规则,例如对象 foo.getTemperature() >= 30 并且 foo.getTypeOfMsg() == Alert。然后,检索“警报”设置对象。如果 foo.getTypeOfMsg() == "Test" 则获取 "Test" 对象。规则是用户驱动的,因此有无限的可能性。对象 foo 由 Web 服务检索,我无需将其存储在数据库中。

【问题讨论】:

  • 所以你有点颠倒了问题。您不是针对多个对象运行查询,而是针对一个对象运行多个查询?还是一次不止一个?
  • @Wayne Young - 是的,它是倒置的......但问题更多的是我如何对 java 对象执行“类似查询”(参见edit1)的操作。

标签: java design-patterns rule-engine


【解决方案1】:

如果您不使用数据库来存储您的对象,那么除了“生成 SQL 查询”部分之外,其他一切都是一样的。你应该看的是Specification Pattern。您的规范对象基本上有一个名为 IsSatisfiedBy 的方法,该方法接收对象以查看它是否符合规范。根据用户输入向规范添加某种参数似乎是一个非常简单的练习,听起来它适用于您的情况。

我不确定我是否理解关于“映射”的部分,但由于您没有生成原始 SQL 查询,因此只需确保您的规范对象是可序列化的并按照您的需要持久化。

LINQ 可以像普通的 C# 或 Java 一样做到这一点。

【讨论】:

  • 可能有助于将脚本引擎混入其中(可能像 Rhino)以允许用户构建规范。这实际上只不过是一个美化的、可配置的过滤器,是吗?除非可以使用索引进行优化,否则将需要过滤对象池。
【解决方案2】:

您是在尝试制作一种数据驱动的解决方案,一种可以由用户或其他人任意修改的解决方案,还是您正在寻找内部驱动的解决方案。

用户驱动的解决方案具有在构建时未知的无限可能性,但它需要某种 UI。您必须将解决方案与 UI 联系起来(例如,显示一个表格并允许他们单击以对给定的行/行进行排序,也许让他们每行输入“过滤条件”)所以我不确定您的搜索有什么优势会提供..

内部驱动的解决方案具有固定数量的可能性,这些可能性在构建时都是已知的。您可以很容易地编写每一个代码 - 可能不像您描述的那样容易,但也不会太难,因为您必须实施的解决方案数量有限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    相关资源
    最近更新 更多