2012-04-08 12 views
11

Ich bin neu mit Spring Data mit MongoDB und möchte eine automatisch generierte Abfrage-Methode innerhalb meiner MongoRepository Erweiterungsschnittstelle, die Filterung, Sortierung und Begrenzung erfordert.Abfrage mit sort() und limit() in Spring Repository-Schnittstelle

Die Abfrage sieht wie folgt aus:

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

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

Das Repository-Schnittstelle sieht wie folgt aus:

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(); 

    ... 
} 

Ich weiß, dass man ein Sortieren Argument einer Abfragemethode, um das Sortieren zu bekommen hinzufügen können aber Das Problem beschränkt die Ergebnisse auf ein einzelnes Objekt. Ist das möglich, ohne ein eigenes JobRepositoryImpl schreiben zu müssen?

Dank

Edit:

Beispiel von dem, was ich suche:

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

oder

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

Aber das funktioniert natürlich nicht :(

Antwort

24

Was ist wro ng mit:

public interface JobRepository extends MongoRepository<Job, String> { 

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

und deren Verwendung:

// 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

Dank Oliver, das ist genau das, was ich suchte. – m1h4

+2

Ich war so beschäftigt, auf der Suche nach einer kurzen und einfachen Abfrage-ähnliche Lösung, die ich nicht die Mühe machte, die Klasse Pageable zu untersuchen und erkennen, dass dies in Kombination mit Sortierung die .sort() und .limit() -Funktionalitäten von eine Mongo-Abfrage. – m1h4

+0

Kein Problem, froh, dass es für Sie geklappt hat! :) –

7

nur eine Korrektur an Oliver Antwort geben, dann ist es Direction.DESC und nicht Directions.DESC und die Reihenfolge der params ist falsch.

Wechsel:

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

zu:

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

Dies sollte ein Kommentar und keine Antwort sein. –

+0

Oder bearbeiten Sie die ursprüngliche Antwort, aber jetzt, da ich darüber nachdenke, haben neue Benutzer nicht die Rep zu kommentieren oder zu bearbeiten. – shoover

+0

@Sinatr siehe [diese Diskussion] (http://meta.stackoverflow.com/questions/260245/when-should-i-make-edits-to-code) auf Meta, insbesondere der Abschnitt "Code in Antworten bearbeiten". TL; DR: SO ist eine Referenzressource, kein Spiel; die Bearbeitung wird empfohlen, wenn sie zu Verbesserungen führt; Alle Änderungen werden protokolliert und jeder kann den Verlauf überprüfen. – shoover