2012-04-08 9 views
11

Sono nuovo di Spring Data con MongoDB e vorrei avere un metodo di query generato automaticamente all'interno della mia interfaccia di estensione MongoRepository che richiede il filtraggio, l'ordinamento e la limitazione.Interrogazione con sort() e limit() nell'interfaccia Spring Repository

La query si presenta così:

// 'created' is the field I need to sort against 

find({state:'ACTIVE'}).sort({created:-1}).limit(1) 

L'interfaccia repository assomiglia a questo:

public interface JobRepository extends MongoRepository<Job, String> { 
    @Query("{ state: 'ACTIVE', userId: ?0 }") 
    List<Job> findActiveByUserId(String userId); 

    // The next line is the problem, it wont work since 
    // it's not in the format @Query expects 
    @Query("find({state:'ACTIVE'}).sort({created:-1}).limit(1)") 
    Job findOneActiveOldest(); 

    ... 
} 

So che si può aggiungere un argomento Ordina a un metodo di query al fine di ottenere l'ordinamento, ma il problema è limitare i risultati a un singolo oggetto. È possibile farlo senza dover scrivere un JobRepositoryImpl personalizzato?

Grazie

Edit:

esempio di quello che sto cercando:

@Query("{ state:'ACTIVE', $orderby: {created:-1}, $limit:1 }") 
Job findOneActiveOldest(); 

o

@Query("{ state:'ACTIVE' }") 
@Sort("{ created:-1 }") 
@Limit(1) 
Job findOneActiveOldest(); 

Ma questo, ovviamente, non funziona :(

risposta

24

Cosa c'è ng con:

public interface JobRepository extends MongoRepository<Job, String> { 

    @Query("{ state : 'ACTIVE' }") 
    Page<Job> findOneActiveOldest(Pageable pageable); 
} 

e di utilizzarlo:

// Keep that in a constant if it stays the same 
PageRequest request = new PageRequest(0, 1, new Sort(Sort.Direction.DESC, "created")); 
Job job = repository.findOneActiveOldest(request).getContent().get(0); 
+0

Grazie Oliver, questo è esattamente quello che stavo cercando. – m1h4

+2

Ero così occupato alla ricerca di una soluzione di query semplice e breve che non mi preoccupassi di esaminare la classe Pageable e rendermi conto che questo in combinazione con Sort sort-of avvolge le funzionalità .sort() e .limit() di una query mongo. – m1h4

+0

Nessun problema, felice ha funzionato per te! :) –

7

Solo l'aggiunta di una correzione alla risposta di Oliver, è Direction.DESC e non Directions.DESC e l'ordine dei params è sbagliato.

Cambio:

PageRequest request = new PageRequest(0, 1, new Sort("created", Directions.DESC)); 

a:

PageRequest request = new PageRequest(0, 1, new Sort(Direction.DESC, "created")); 
+7

Questo dovrebbe essere un commento e non una risposta. –

+0

Oppure modifica la risposta originale, ma ora che ci penso, i nuovi utenti non hanno il rep per commentare o modificare. – shoover

+0

@Sinatr vedere [questa discussione] (http://meta.stackoverflow.com/questions/260245/when-should-i-make-edits-to-code) su meta, in particolare la sezione "Modifica del codice nelle risposte". TL; DR: SO è una risorsa di riferimento, non un gioco; il montaggio è incoraggiato se produce miglioramenti; tutte le modifiche sono registrate e chiunque può rivedere la cronologia. – shoover