En décomposant, la requête avec le mot-clé Between
est exécuté sur la base de données MongoDB avec le résultat logique {"createdAt" : {"$gt" : d1, "$lt" : d2}}
il y a donc une chance que vous n'obteniez pas les documents qui ont le createdAt
date incluse dans la plage de dates donnée, c'est-à-dire d1 < createdAt < d2
car la plage de dates donnée ne répond pas aux critères. Pour référence, voici quelques-unes des interprétations sur le méthodes de requête
:
Mots clés pris en charge pour les méthodes de requête
Keyword Sample Logical result
After findByBirthdateAfter(Date date) {"birthdate" : {"$gt" : date}}
Before findByBirthdateBefore(Date date) {"birthdate" : {"$lt" : date}}
Between findByAgeBetween(int from, int to) {"age" : {"$gt" : from, "$lt" : to}}
Comme solution de contournement, vous pouvez utiliser le @Query
annotation. Je n'ai pas testé cela, mais vous pouvez essayer l'exemple d'implémentation de requête personnalisée suivant :
public interface UserRepository extends MongoRepository<User, String> {
@Query(value = "{ 'createdAt' : {$gte : ?0, $lte: ?1 }}")
public ArrayList<User> findbyCreatedAtBetween(Date from, Date to);
}
Si ce qui précède ne fonctionne pas pour vous, créez une interface personnalisée et votre classe d'implémentation pour exécuter la requête personnalisée. Par exemple, créez une interface avec un nom qui ajoute Custom
:
public interface UserRepositoryCustom {
public List<User> findbyCreatedAtBetween(Date from, Date to);
}
Modifier le UserRepository
et ajoutez le UserRepositoryCustom
interface à étendre :
@Repository
public interface UserRepository extends UserRepositoryCustom, MongoRepository {
}
Créez votre classe d'implémentation pour implémenter les méthodes définies dans UserRepositoryCustom
interface.
public class UserRepositoryImpl implements UserRepositoryCustom {
@Autowired
MongoTemplate mongoTemplate;
@Override
public ArrayList<User> findbyCreatedAtBetween(Date from, Date to) {
return mongoTemplate.find(
Query.addCriteria(Criteria.where("createdAt").gte(from).lte(to));
}
}