2013-10-11 131 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