2017-08-01 3 views
0

Je crée un site web avec l'API REST, Angular 2 sur front-end et Spring sur back-end. Et il y a un parchemin infini quand je regarde le résultat de la requête. Et j'utilise la recherche en texte intégral pour trouver les correspondances de ma demande. Ma question est comment créer des requêtes portionnées dans ma recherche Hibernate? Si possible, présentez quelques exemples de code.Hibernate Search Requêtes portionnées

Paix de code que j'utilise pour la recherche de texte intégral

@Repository 
@Transactional 
public class HibernateSearch { 
@PersistenceContext 
    private EntityManager entityManager; 

    public List<Manual> fulltextSearching(String keyword){ 
    if(keyword.equals("")) return Collections.emptyList(); 
    FullTextEntityManager fullTextEntityManager = 
      org.hibernate.search.jpa.Search.getFullTextEntityManager(entityManager); 
    QueryBuilder qb = fullTextEntityManager.getSearchFactory() 
      .buildQueryBuilder().forEntity(Manual.class).get(); 
    javax.persistence.Query jpaQuery = 
      fullTextEntityManager.createFullTextQuery(createQuery(qb, keyword), Manual.class); 
    @SuppressWarnings("unchecked") 
    List<Manual> result = jpaQuery.getResultList(); 
    return result; 
    } 

private org.apache.lucene.search.Query createQuery(QueryBuilder qb, String keyword){ 
    return qb 
      .keyword() 
      .onFields("name", "introduction", "user.username", "tags.name") 
      .matching(keyword) 
      .createQuery(); 
    } 


} 

Répondre

0

Utilisation d'échange, tel que fourni par l'API Java Persistence:

@Repository 
@Transactional 
public class HibernateSearch { 
@PersistenceContext 
    private EntityManager entityManager; 

    public List<Manual> fulltextSearching(String keyword, int offset, int limit){ 
    if(keyword.equals("")) return Collections.emptyList(); 
    FullTextEntityManager fullTextEntityManager = 
      org.hibernate.search.jpa.Search.getFullTextEntityManager(entityManager); 
    QueryBuilder qb = fullTextEntityManager.getSearchFactory() 
      .buildQueryBuilder().forEntity(Manual.class).get(); 
    javax.persistence.Query jpaQuery = 
      fullTextEntityManager.createFullTextQuery(createQuery(qb, keyword), Manual.class); 

    // ADDED CODE HERE 
    jpaQuery.setFirstResult(offset); 
    jpaQuery.setMaxResults(limit); 

    @SuppressWarnings("unchecked") 
    List<Manual> result = jpaQuery.getResultList(); 
    return result; 
    } 

private org.apache.lucene.search.Query createQuery(QueryBuilder qb, String keyword){ 
    return qb 
      .keyword() 
      .onFields("name", "introduction", "user.username", "tags.name") 
      .matching(keyword) 
      .createQuery(); 
    } 


} 

Les résultats sont triés par pertinence par défaut, donc il n'y a pas besoin pour ajouter un tri.

+0

merci, ça marche pour moi –

+0

Pour obtenir la deuxième page, avez-vous besoin de créer un nouveau 'FullTextQuery' ou pouvez-vous réutiliser l'objet' jpaQuery'? – nuoritoveri

+0

@nuoritoveri Vous pouvez réutiliser la requête tant que votre EntityManager est ouvert. –