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