spring data - type - Consulta con sort() y limit() en la interfaz de Spring Repository
spring boot jpa (2)
Qué hay de malo en:
public interface JobRepository extends MongoRepository<Job, String> {
@Query("{ state : ''ACTIVE'' }")
Page<Job> findOneActiveOldest(Pageable pageable);
}
y usándolo:
// 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);
Soy nuevo en Spring Data con MongoDB y me gustaría tener un método de consulta generado automágicamente dentro de mi interfaz de extensión MongoRepository que requiere filtrado, clasificación y limitación.
La consulta se ve así:
// ''created'' is the field I need to sort against
find({state:''ACTIVE''}).sort({created:-1}).limit(1)
La interfaz del repositorio se ve así:
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 agregar un argumento de clasificación a un método de consulta para obtener la clasificación, pero el problema es limitar los resultados a un solo objeto. ¿Se puede hacer esto 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 :(
Solo agregando una corrección a la respuesta de Oliver, es Direction.DESC
y no Directions.DESC
y el orden de los parámetros es incorrecto.
Cambio :
PageRequest request = new PageRequest(0, 1, new Sort("created", Directions.DESC));
a:
PageRequest request = new PageRequest(0, 1, new Sort(Direction.DESC, "created"));