2013-04-18 7 views
14

Mam tabelę przesyłania z identyfikatorami, nazwami, kodami i innymi właściwościami. Moim wymaganiem jest wyszukiwanie rekordów na podstawie wspomnianych właściwości i zwrócenie zestawu stronicowanego.Zapytanie JPA do wyboru na podstawie kryteriów z podziałem na paginy

To pseudokod co szukam

searchSubmission(searchFilter sf,pageIndex,noOfRecords) 
{ 
    query = 'from submisssion where code=sf.code or id=sf.id order by id start_from (pageIndex*noOfRecords) limit noOfRecords' 
    return result(); 

} 

Wydaje się, że wiele opcji: CriteriaBuilder, NamedQuery etc .. który jest skuteczny jeden w tej sytuacji?

Odpowiedz

32

Dla wszystkich obiektów zapytań JPA (z wyjątkiem natywnych zapytań SQL), używałbyś podziału na strony za pomocą metod setMaxResults (int) i setFirstResult (int). Na przykład:

return em.createNamedQuery("yourqueryname", YourEntity.class) 
     .setMaxResults(noOfRecords) 
     .setFirstResult(pageIndex * noOfRecords)); 
     .getResultList(); 

JPA wykona dla ciebie podział na strony.

Zapytania nazwane są po prostu wstępnie zdefiniowane i mogą być buforowane, podczas gdy inne typy są tworzone dynamicznie.
więc wybór jest użycie JPQL jak:

Query query = em.createQuery("SELECT s FROM Submission s WHERE s.code = :code or s.id = :id ORDER BY s.id", Submission.class); 

Albo CriteriaBuilder API do utworzenia podobnego zapytania:

CriteriaBuilder qb = em.getCriteriaBuilder(); 
    CriteriaQuery<Submission> cq = qb.createQuery(Submission.class); 

    Root<Submission> root = cq.from(Submission.class); 
    cq.where(qb.or( 
     qb.equal(root.get("code"), qb.parameter(String.class, "code")), 
     qb.equal(root.get("id"), qb.parameter(Integer.class, "id")) 
    )); 
    Query query = em.createQuery(cq); 

nie zapomnij, aby ustawić wartości parametrów za pomocą query.setParameter ("id ", sf.id) na przykład.

1

Można użyć Pageable w repozytorium metody

@Repository 
public interface StateRepository extends JpaRepository<State, Serializable> { 

@Query("select state from State state where state.stateId.stateCode = ?1") 
public State findStateByCode(String code, Pageable pageable); 

}

I w warstwie usług, można utworzyć obiekt Pageable:

@Autowire 
StateRepository stateRepository; 

public State findStateServiceByCode(String code, int page, int size) { 
    Pageable pageable = new PageRequest(page, size); 
    Page<Order> statePage = stateRepository.findStateByCode(code, pageable); 
    return statePage.getContent(); 
} 
Powiązane problemy