2012-04-08 18 views
11

Soy nuevo en Spring Data con MongoDB y me gustaría tener un método de consulta generado automáticamente en mi interfaz de extensión de MongoRepository que requiere filtrado, clasificación y limitación.Consulta con sort() y limit() en la interfaz Spring Repository

La consulta se parece a esto:

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

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

La interfaz del repositorio tiene el siguiente aspecto:

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

    ... 
} 

Sé que se puede añadir un argumento clasificar a un método de consulta a fin de obtener la clasificación, pero el problema es limitar los resultados a un solo objeto. ¿Es posible hacerlo sin tener que escribir un JobRepositoryImpl personalizado?

Gracias

Editar:

ejemplo de lo que estoy buscando:

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

o

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

Pero esto, obviamente, no funciona :(

Respuesta

24

¿Qué es wro? NG con:

public interface JobRepository extends MongoRepository<Job, String> { 

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

y usarlo:

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

Gracias Oliver, esto es exactamente lo que estaba buscando. – m1h4

+2

Estaba tan ocupado buscando una solución de consulta simple y corta que no me molesté en examinar la clase Pageable y me di cuenta de que esto, en combinación con Sort, envuelve las funcionalidades .sort() y .limit() de una consulta mongo. – m1h4

+0

¡No hay problema, me alegro de que funcionó para ti! :) –

7

Simplemente añadiendo una corrección a la respuesta de Oliver, es Direction.DESC y no Directions.DESC y el orden de los parametros es erróneo.

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

Esto debería ser un comentario y no una respuesta. –

+0

O edite la respuesta original, pero ahora que lo pienso, los usuarios nuevos no tienen el representante para comentar O para editar. – shoover

+0

@Sinatr ver [esta discusión] (http://meta.stackoverflow.com/questions/260245/when-should-i-kear-edits-to-code) en meta, en particular la sección "Código de edición en las respuestas". TL; DR: SO es un recurso de referencia, no un juego; se recomienda editar si produce mejoras; todas las modificaciones se registran y cualquiera puede revisar el historial. – shoover

Cuestiones relacionadas