package netgloo.search; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.transaction.Transactional; import netgloo.models.User; import org.hibernate.search.jpa.FullTextEntityManager; import org.hibernate.search.query.dsl.QueryBuilder; import org.springframework.stereotype.Repository; /** * Search methods for the entity User using Hibernate search. * The Transactional annotation ensure that transactions will be opened and * closed at the beginning and at the end of each method. * * @author netgloo */ @Repository @Transactional public class UserSearch { // ------------------------ // PRIVATE FIELDS // ------------------------ // Spring will inject here the entity manager object @PersistenceContext private EntityManager entityManager; // ------------------------ // PUBLIC METHODS // ------------------------ /** * A basic search for the entity User. The search is done by exact match per * keywords on fields name, city and email. * * @param text The query text. */ public List<User> search(String text) { // get the full text entity manager FullTextEntityManager fullTextEntityManager = org.hibernate.search.jpa.Search. getFullTextEntityManager(entityManager); // create the query using Hibernate Search query DSL QueryBuilder queryBuilder = fullTextEntityManager.getSearchFactory() .buildQueryBuilder().forEntity(User.class).get(); // a very basic query by keywords org.apache.lucene.search.Query query = queryBuilder .keyword() .onFields("name", "city", "email") .matching(text) .createQuery(); // wrap Lucene query in an Hibernate Query object org.hibernate.search.jpa.FullTextQuery jpaQuery = fullTextEntityManager.createFullTextQuery(query, User.class); // execute search and return results (sorted by relevance as default) @SuppressWarnings("unchecked") List<User> results = jpaQuery.getResultList(); return results; } // method search } // class