Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java和sql数据库动态创建搜索条件和结果_Java_Sql_Performance_Hibernate_Search - Fatal编程技术网

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

使用Java和sql数据库动态创建搜索条件和结果,java,sql,performance,hibernate,search,Java,Sql,Performance,Hibernate,Search,我目前正在使用一个由Hibernate支持的基于Java的web应用程序JSF,该应用程序针对不同的区域具有各种不同的搜索页面 搜索页面包含搜索字段部分,用户可以自定义他们感兴趣的搜索字段。有一系列不同的搜索字段类型,可以添加精确文本、以、包含、多选列表框、逗号分隔值等。不需要填写搜索字段,搜索字段将被忽略,其中,与其他一些搜索字段一样,需要不同的搜索字段才能具有此搜索字段的值 目前,我们为每个区域使用一个自定义搜索对象,该区域特定于该区域,并且具有硬编码的getter和setter搜索字段 p

我目前正在使用一个由Hibernate支持的基于Java的web应用程序JSF,该应用程序针对不同的区域具有各种不同的搜索页面

搜索页面包含搜索字段部分,用户可以自定义他们感兴趣的搜索字段。有一系列不同的搜索字段类型,可以添加精确文本、以、包含、多选列表框、逗号分隔值等。不需要填写搜索字段,搜索字段将被忽略,其中,与其他一些搜索字段一样,需要不同的搜索字段才能具有此搜索字段的值

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

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

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

  ...
}
在本例中,SearchFieldType和另一个SearchFieldType表示不同的搜索类型,如TextSearchField或NumericSearchField,其搜索类型分别以、包含、大于、等于、小于等开头,搜索值可以输入或保留为空以忽略搜索字段

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

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

我们在每个结果的结果对象中返回结果,该结果还硬编码可以显示的列。此表由hibernate注释支持,但我们尝试使用平面数据,而不是允许其他hibernate支持的对象最小化延迟连接数据

@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);

  ...
}
搜索页面由数据库中的一个视图支持,该视图处理与每个可能结果所需的所有表的连接。这个视图变得非常庞大,每次搜索都会带来巨大的性能损失,即使用户只想搜索一个字段并显示几个列,因为我们有30多个搜索字段选项和30个不同的列,它们可以显示,这都是由一个视图支持的

除此之外,用户随时都会请求添加到页面中的新搜索字段和列。我们最终不得不更改搜索和结果对象以及备份视图来进行这些更改

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

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

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

有没有一个框架可以帮助我解决这个问题?我一直在寻找一些东西,我找到的最接近的东西是SqlBuilder

还有其他人动态地解决过类似的问题吗

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

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


提前感谢您的回答

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