我目前正在使用由 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 对象中支持我们的结果,该对象还对可以显示的列进行硬编码。该表由 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 仍然是这个问题的有效解决方案吗?我不想创建在休眠条件中使用的 Result 对象,因为它们的结果列可能不同。搜索字段和/或结果列都可能需要连接表。
有没有可以帮助解决问题的框架?我一直在寻找一些东西,我找到的最接近的是SqlBuilder。
有没有其他人动态地解决了类似的问题?
如果解决方案已经存在,我宁愿不要重新发明轮子。
我很抱歉这最终变成了一堵文字墙。这是我的第一篇 stackoverflow 帖子,我想确保我彻底定义了我的问题。
提前感谢您的回答!