2012-04-26 177 views
6

在我的一个应用程序中,我将执行多个字段/列的搜索。它是一个高级搜索,有超过20个字段可供用户搜索结果。例如,用户可以搜索基于高级搜索使用Hibernate搜索

  1. 预定ID
  2. 旅客姓名
  3. 乘客年龄
  4. 出发地点
  5. 要位置
  6. 订单管理
  7. 的名称预订航空公司

和13个这样的字段。

我想如果

  1. Hibernate Search的找出可以而且应该在这里使用?如果是这样,怎么样?我无法找到使用Hibernate Search进行如此复杂搜索的示例。

  2. 而不是Hibernate搜索,我可以简单地使用Hibernate,也许设计一个多线程搜索取决于参数的数量。这是个好主意吗?

  3. 这里可以使用Hibernate Filters吗?

有人可以提供输入或参考链接吗?

+0

您是否期望用户将自己的搜索条件输入到一个字段中,然后针对多个列进行测试?或为每列分开搜索字段? – 2012-05-20 21:57:31

+0

其每个列的单独字段。 – 2012-05-21 03:12:35

回答

2

对于这些类型的查询,我通常使用带有表单对象的Criteria查询。然后在每个传递的表单字段中检查null,如果不是null,则使用该字段将另一个Restriction添加到查询中。使用Criteria查询可以保持Java代码非常干净并消除混乱的字符串连接。一个例子为您的情况:

// Form object 
public class bookingSearchForm { 
    private String bookingId; 
    public getBookingId()... 
    public setBookingId()... 
} 

// Hibernate 
Criteria criteria = getSession().createCriteria(Booking.class); 
if(form.getBookingId() != null) { 
    criteria.add(Restrictions.eq("bookingId", form.getBookingId())); 
} 
criteria.list(); 
+0

嗨@Aaron,谢谢你的回复。我的问题是数据分布在大约25个表格中。所以说如果我使用Criteria,这将是一个与Joins的巨大声明。这是我想避免有一个干净的实现。如果我有5-6个字段可供搜索,你所提出的建议完美无缺。 – 2012-04-27 04:46:07

+0

如果你有Hibernate实体建立关系,那么Hibernate会为你处理所有这些连接,并且你将能够在这些其他表上使用上述策略。在Hibernate中思考,而不是SQL,让工具为你做好工作。 – atrain 2012-04-27 12:42:40

+0

我不确定我是否正确理解你。让我举一个例子,我要搜索“旅行类型”是“单行”的“预订”。旅行类型嵌入在“预订”类以下6级的类中。所以我实际上必须搜索旅行类型而不是预订类。现在可以有20个这样的参数,我将在其中搜索哪些从Booking类的各个级别嵌入。如果我必须使用标准来做到这一点,那么我将不得不加入所有这些级别的表格,我认为这些表格非常麻烦。 – 2012-04-27 17:40:59

0

是的,Hibernate搜索将在这种情况下非常有用。你可以使用过滤器,但Hibernate Search也有过滤器。

2

我认为你的决定应该基于容量的要求。 普通的Hibernate查询可能足以在这些许多字段上进行搜索。

如果您想使用反向索引快速获取大量数据的搜索查询,Hibernate Search将会有所帮助。例如,您应该做的就是在未来5年内用您期望的容量加载数据库。如果你的普通Hibernate查询被认为是可以接受的,我想你应该坚持使用普通的Hibernate查询。

您也可以在稍后的阶段介绍Hibernate搜索。

编辑: 您可以选择不使用Hibernte搜索,下降到较低的级别,而是使用Apache Lucene。你可以生成你自己的Apache Lucene索引。这样您就不必担心为了查找记录而使用哪个字段,因为您将完全控制标记化和索引过程。 如果您选择这种方式,您可以将行名和列名存储为搜索结果的一部分。

+0

感谢您的回复@Daniel。这里我关心的是为了生成查询而必须写入的复杂代码的数量。我从超过25张表中搜索,需要手动写入的连接数量非常容易出错。 – 2012-05-24 19:25:42

+0

担心复杂的代码?向下一级到Apache Lucene。您不必创建Hibernate查询,而是查询您自己创建的Lucene索引。唯一的缺点是你需要了解底层的Lucene技术。 – 2012-10-04 13:45:06