我正在尝试通过以下链接使用hibernate全文: hibernate/search/4.1/reference/en-US/html/getting-started
基本上,它有效,但我想知道如何在执行全文查询时获得总计数,然后我可以告诉用户在这样的查询中会有多少结果和多少页。
以下是代码(使用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来获取总数。
答案 0 :(得分:10)
query.getResultSize(); //return the total number of matching ... regardless of pagination
答案 1 :(得分: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();
答案 2 :(得分:1)
对于Hibernate(可能是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()将可用
答案 3 :(得分:0)
直接使用Lucene / Solr 时,我通常会通过搜索*:*
来使用hack *,将其设置为返回尽可能少的结果但是 返回"所有" 的总结果计数,然后我继续提取它。基本上它与SELECT count(*) FROM whatever
:P
*我说 hack 因为我不确定它是否应该是那样,但它对我有用......