2015-09-11 24 views
7

È possibile recuperare i dati in intervalli definiti dall'utente [int record iniziale - ultimo record]?Come interrogare i dati tramite dati primari JPA con offset e limite definiti dall'utente (intervallo)

Nel mio caso utente definiranno in stringa di query in cui gamma che vuole recuperare i dati. Ho provato qualcosa di simile

Pageable pageable = new PageRequest(0, 10); 
    Page<Project> list = projectRepository.findAll(spec, pageable); 

Dove spec è la mia specifica definita, ma purtroppo questo non aiutano. Forse sto facendo qualcosa di sbagliato qui.

Ho visto altri metodi forniti da jpa di primavera ma nulla è di grande aiuto.

l'utente può immettere qualcosa come questo localhost: 8080/Sezione/dipendente? range {"columnName": nome: "da": 6, "a": 20}

Quindi questo dice di recuperare i dati dei dipendenti e recupererà i primi 15 record (ordinati per columnName) non importa di adesso.

Se mi può suggerire qualcosa di meglio sarebbe bello. Se pensi di non aver fornito abbastanza informazioni per favore fammi sapere, fornirò le informazioni richieste.

Aggiornamento: non desidero utilizzare le istruzioni native o Create query (finché non ho altre opzioni). può essere qualcosa di simile:

Pageable pageable = new PageRequest(0, 10); 
     Page<Project> list = projectRepository.findAll(spec, new pageable(int startIndex,int endIndex){ 
// here my logic. 

}); 

Se si dispone di opzioni migliori, mi può suggerire che pure.

Grazie.

risposta

6

Il tuo approccio non ha funzionato, perché new PageRequest(0, 10); doens't fare quello che pensare. Come indicato in docs, gli argomenti di input sono page e size, non limit e offset.

Per quanto ne so (e qualcuno mi corregge se ho torto), non esiste un supporto "pronto all'uso" per ciò che è necessario nei repository SrpingData predefiniti. Ma puoi creare un'implementazione personalizzata di Pagable, che prenderà i parametri limite/offset. Ecco esempio di base - Spring data Pageable and LIMIT/OFFSET

+0

grazie per la tua risposta, mi ha definitivamente dato la direzione. – Roxy

4

Possiamo farlo con Impaginazione e impostando il nome della colonna tabella del database, il valore & fila conta come di seguito:

@Transactional(readOnly=true) 
public List<String> queryEmployeeDetails(String columnName,String columnData, int startRecord, int endRecord) { 
    Query query = sessionFactory.getCurrentSession().createQuery(" from Employee emp where emp.col= :"+columnName); 
    query.setParameter(columnName, columnData); 
    query.setFirstResult(startRecord); 
    query.setMaxResults(endRecord); 
    List<String> list = (List<String>)query.list(); 
    return list; 
} 
+0

grazie per la risposta ... mi puoi illustrare, come possiamo raggiungere questo obiettivo con paginazione? – Roxy

+0

Credo che tu stia cercando di scrivere 'da Employee emp dove emp. ' + columnName + '=: foo'' e quindi 'query.setParameter (" foo ", columnData);'? –

1

Se io sto capendo il problema in modo corretto, volete che il vostro repository per consentire all'utente di

  1. fornire criteri per la query (tramite Specification)
  2. Fornire colonna per ordinare
  3. Fornire l'intervallo di risultati da recuperare.

Se la mia comprensione è corretta, allora:

Al fine di raggiungere 1., si può fare uso di JpaSpecificationExecutor dalla primavera dati JPA, che permettono di passare in Specificiation per la query.

Entrambe le versioni 2 e 3 sono ottenibili in JpaSpecificationExecutor mediante l'utilizzo di Pagable. Pageable consentono di fornire l'indice iniziale, il numero di record e le colonne di ordinamento per la query. Dovrai implementare il tuo intervallo Pageable. PageRequest è un buon riferimento su ciò che è possibile implementare (o lo si può estendere credo).

+0

grazie per la tua risposta, puoi per favore reindirizzare me ad un esempio, che mostra l'uso di JpaSpecificationExecutor? sfortunatamente non ho trovato nessuno. – Roxy

+1

Non l'ho usato in realtà. Ecco cosa ho trovato su google: http://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/ Anche se usano QueryDSL per la costruzione di specifiche, ti credo può farlo con un metodo più artigianale (QueryDSL richiede la generazione di codice che potrebbe essere un problema per te). Almeno la pagina ti dà un'idea su come lavorare con 'JpaSpecificationExecutor' –

+1

In realtà mi sono perso che 'Pageable' sta anche fornendo' Sort'. Quindi, un "Pageable" personalizzato (o usando 'PageRequest') farà il trucco –

1

così ho ottenuto questo funzionamento come uno della risposta suggerito, ho implementato il mio paginabile e overrided getpagesize(), getOffset(), getSort() questo è tutto. (Nel mio caso non ho bisogno di più)

public Range(int startIndex, int endIndex, String sortBy) { 
     this.startIndex = startIndex; 
     this.endIndex = endIndex; 
     this.sortBy = sortBy; 
    } 

    @Override 
    public int getPageSize() { 
     if (endIndex == 0) 
      return 0; 
     return endIndex - startIndex; 
    } 

    @Override 
    public int getOffset() { 
     // TODO Auto-generated method stub 
     return startIndex; 
    } 

    @Override 
    public Sort getSort() { 
     // TODO Auto-generated method stub 
     if (sortBy != null && !sortBy.equalsIgnoreCase("")) 
      return new Sort(Direction.ASC, sortBy); 
     else 
      return new Sort(Direction.ASC, "id"); 
    } 

dove startIndex, endIndex stanno iniziando e ultimo indice di record.

per accedervi:

repository.findAll(spec,new Range(0,20,"id");