2013-10-11 94 views
3

我想知道如何将以下两个查询结合在一起。使用标准查询限制加入hibernate搜索查询

标准的条件查询

Criteria result1 = session.createCriteria(Store.class).add(Restrictions.eq("department.name", category)); 

和FullTextSearch

QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Store.class).get(); 
    Query luceneQuery = queryBuilder.keyword().onFields("productTitle").matching(keyword).createQuery(); 

    // wrap Lucene query in a javax.persistence.Query 
    org.hibernate.Query fullTextQuery = fullTextSession.createFullTextQuery(luceneQuery, Store.class); 
    fullTextQuery.setMaxResults(15); 
    fullTextQuery.setFirstResult(0); 

我通过其他参数通过URL加一个关键字参数,我不想完全依赖于关键字搜索。有人知道如何使这些工作在一起吗?

谢谢。

回答

2

对于任何未来可能需要此功能的人来说,这将演示如何使用hibernate搜索进行其他查询限制。

QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Store.class).get(); 
    Query luceneQuery = queryBuilder.keyword().onFields("productTitle").matching(keyword).createQuery(); 

    org.hibernate.search.FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(luceneQuery, Store.class); 

    Criteria query = session.createCriteria(Store.class) 
      .createAlias("department", "department") 
      .add(Restrictions.eq("department.name", category)); 

    fullTextQuery.setCriteriaQuery(query); 
    fullTextQuery.setMaxResults(15); 
    fullTextQuery.setFirstResult(0); 
+0

我觉得你的例子缺少'setCriteriaQuery(criteria);'部分还有 – Hardy

+0

哎呀,赶上,修复了这个例子。 –

4

Hibernate的搜索文件实际上不鼓励使用Criteria查询全文搜索查询相结合(除指定获取类型)。

只有获取模式可以调整,不要应用任何其他的 限制。虽然已知它是在Hibernate Search 4中工作的,但在条件查询中使用 限制(即where子句)应尽可能避免 。如果 与带有限制条件一起使用,则getResultSize()将引发SearchException。

又见http://docs.jboss.org/hibernate/search/4.4/reference/en-US/html_single/index.html#d0e5722

+0

你有没有建议提出更好的方法来处理这些限制? –

+0

最好的方法是索引您的查询所需的所有数据,并执行一次Lucene查询。在你的情况下,你也将不需要部门名称,然后创建一个Lucene的BooleanQuery。根据使用情况,您还可以结合全文过滤器使用查询。查看文档以获取有关这些功能的更多信息。 – Hardy