繁体   English   中英

使用Java和sql数据库动态创建搜索条件和结果

[英]Dynamically create search criteria and results using Java and sql database

我目前正在使用Hibernate支持的基于Java的Web应用程序(JSF),该应用程序具有针对不同领域的多种不同搜索页面。

搜索页面包含一个搜索字段部分,用户可以在其中自定义他们感兴趣的搜索字段。可以添加一系列不同的搜索字段类型(确切的文本,以,开头,包含,多选列表框,逗号分隔值等等)。 不需要填写搜索字段并将其忽略,因为其他一些搜索字段需要其他搜索字段才能使该搜索字段具有值才能正常工作。

当前,我们针对每个区域使用特定于该区域的自定义搜索对象,并具有硬编码的getter和setter搜索字段。

public interface Search {
  SearchFieldType getSearchPropertyOne();
  void setSearchPropertyOne(SearchFieldType searchPropertyOne);

  AnotherSearchFieldType getSearchPropertyTwo();
  void setSearchPropertyTwo(AnotherSearchFieldType searchPropertyTwo);

  ...
}

在此示例中,SearchFieldType和AnotherSearchFieldType表示不同的搜索类型,例如TextSearchField或NumericSearchField,其搜索类型分别为(大于,等于,大于等)或(大于,等于,小于等),以及具有他们可以输入或保留为空(忽略搜索字段)。

我们使用此搜索对象来准备一个Criteria对象

搜索结果部分是一个表,用户也可以对其进行自定义,以仅包含他们感兴趣的结果对象的列。大多数列可以按升序或降序排列。

我们将结果支持在每个结果的Result对象中,该对象还对可以显示的列进行了硬编码。 该表由休眠注释支持,但是我们尝试使用平面数据,而不是允许其他休眠支持的对象最小化惰性连接数据。

@Entity(table = "result_view")
public interface Result {
  @Column(name = "result_field_one")
  Long getResultFieldOne();
  void setResultFieldOne(Long resultFieldOne);

  @Column(name = "result_field_two")
  String getResultFieldTwo();
  void setResultFieldTwo(String resultFieldTwo);

  ...
}

搜索页面由我们数据库中的一个视图支持,该视图处理所有可能结果所需的所有表的联接。 这种视图已经变得非常庞大,即使用户只想在一个字段上进行搜索并显示几列,每次搜索都会对性能造成巨大的影响,因为我们有多达三十个搜索字段选项和三十个不同的列可以显示而所有这些都受到一个观点的支持。

最重要的是,用户一直希望将其添加到页面中时请求新的搜索字段和列。 我们最终不得不更改搜索和结果对象以及支持视图以进行这些更改。

我们正在尝试调查此事,并找到替代方法。 提到的一种方法是创建不同的视图,然后根据在结果表中搜索或显示的字段来动态选择这些视图。 不同的视图可能会连接到不同的列,因此我们选择并选择任何给定搜索所需的视图。

我正在尝试以另一种方式考虑问题。 我认为最好不要使用视图,而是根据请求的搜索字段和结果列动态连接我们需要的表。 我还认为搜索和结果对象不应包含硬编码的getter / setter,而应是搜索字段的集合和结果列的集合(或映射)。 我还没有完全充实我的想法。

休眠仍然是解决此问题的有效方法吗? 我不想创建在休眠条件中使用的Result对象,因为它们的结果列可以不同。 搜索字段和/或结果列都可能需要联接表。

有没有我可以使用的框架来帮助解决问题? 我一直在寻找东西,而我发现最接近的东西是SqlBuilder。

是否有人动态地解决过类似的问题?

如果解决方案已经存在,我希望不要重新发明轮子。

我很抱歉这最终变成了文字墙。 这是我的第一个stackoverflow帖子,我想确保我彻底定义了问题。

预先感谢您的回答!

我不完全了解这个问题。 但是JPA Criteria API似乎非常灵活,可以用于基于用户提交的过滤条件来构建查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM