2012-03-26 35 views
2

我使用通过以下链接冬眠全文努力: hibernate/search/4.1/reference/en-US/html/getting-started如何在Hibernate全文搜索中获得总数?

基本上,它的工作原理,但我想知道如何获得总计数,而我执行全文查询,那么我可以告诉用户有多少结果以及在这样的查询中将有多少页面。

下面是代码(使用JPA创建和执行搜索):

EntityManager em = entityManagerFactory.createEntityManager(); 
FullTextEntityManager fullTextEntityManager = 
org.hibernate.search.jpa.Search.getFullTextEntityManager(em); 
em.getTransaction().begin(); 

// create native Lucene query unsing the query DSL 
// alternatively you can write the Lucene query using the Lucene query parser 
// or the Lucene programmatic API. The Hibernate Search DSL is recommended though 
QueryBuilder qb = fullTextEntityManager.getSearchFactory() 
    .buildQueryBuilder().forEntity(Book.class).get(); 
org.apache.lucene.search.Query query = qb 
    .keyword() 
    .onFields("title", "subtitle", "authors.name", "publicationDate") 
    .matching("Java rocks!") 
    .createQuery(); 

// wrap Lucene query in a javax.persistence.Query 
javax.persistence.Query persistenceQuery = 
    fullTextEntityManager.createFullTextQuery(query, Book.class); 
persistenceQuery.setFirstResult((page - 1) * PAGECOUNT); 
    persistenceQuery.setMaxResults(PAGECOUNT); 
// execute search 
List result = persistenceQuery.getResultList(); 

em.getTransaction().commit(); 
em.close(); 

在SQL中,我可以使用select count(*) from something,但在这里我不知道该怎么做。我想每次只读取一页数据,并使用另一个API来计算总数。

回答

3

我不确定在使用Hibernate全文搜索时是否有这样的方法。

如果你想知道结果的总数,那么你必须执行完整的查询。完整计数后,您可以设置页面限制器并重新执行。

javax.persistence.Query persistenceQuery = 
    fullTextEntityManager.createFullTextQuery(query, Book.class); 

int count = persistenceQuery.getResultList().size(); 

persistenceQuery = 
    fullTextEntityManager.createFullTextQuery(query, Book.class); 
persistenceQuery.setFirstResult((page - 1) * PAGECOUNT); 
persistenceQuery.setMaxResults(PAGECOUNT); 
List result = persistenceQuery.getResultList(); 
+0

对不起,我没没有清楚地描述我的问题,实际上我添加了两行代码:javax.persistence.Query persistenceQuery = fullTextEntityManager.createFullTextQuery(query,PSubject.class); \t \t persistenceQuery.setFirstResult((page - 1)* PAGECOUNT); \t \t persistenceQuery.setMaxResults(PAGECOUNT);所以我想知道另一种计算总数的方法,每次只获取一页实际数据。 – Tom 2012-03-26 08:44:39

+0

根据您更改的要求更改了我的答案。现在代码看起来很脏;)它也不是很高效,因为你必须执行两次查询。希望有人想出更好的答案。 – magomi 2012-03-26 09:45:49

8
query.getResultSize(); //return the total number of matching ... regardless of pagination 
+0

你的“查询”是什么类型? javax.persistence.Query和org.apache.lucene.search.Query都没有这样的方法:getResaultSize – Tom 2012-07-30 03:02:44

+1

FullTextQuery由上面的fullTextEntityManager.createFullTextQuery(..)返回。 – skrymir1 2012-08-01 10:50:11

+0

有点简短的答案。也许将注释移出代码? – nalply 2012-10-10 20:32:04

1

对于休眠(也许是因为JPA)

public interface FullTextQuery extends Query 
换句话说

,你需要使用

org.hibernate.search.FullTextQuery query = fullTextEntityManager.createFullTextQuery(query, Book.class); 

,而不是

org.hibernate.Query query = fullTextEntityManager.createFullTextQuery(query, Book.class); 

和方法getResultSize()将可用

0

当使用直接的Lucene/Solr的,我通常通过搜索*:*使用一劈*,将其设置为返回尽可能少的结果,但是确实返回总结果计数为“所有”,然后我继续提取它。基本上它是一样的SELECT count(*) FROM whatever:P

*我说破解因为我不知道这是否应该是这样或不是,但它为我的作品...

相关问题