Chia nhỏ, truy vấn với từ khóa Between
đang được thực thi dựa trên cơ sở dữ liệu MongoDB với kết quả lôgic {"createdAt" : {"$gt" : d1, "$lt" : d2}}
vì vậy có khả năng bạn không nhận được tài liệu có createdAt
bao gồm ngày trong phạm vi ngày nhất định, tức là d1 < createdAt < d2
vì phạm vi ngày nhất định không đáp ứng tiêu chí. Để tham khảo, đây là một số diễn giải về phương pháp truy vấn
:
Từ khóa được hỗ trợ cho các phương pháp truy vấn
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}}
Để giải quyết vấn đề, bạn có thể muốn sử dụng @Query
chú thích. Tôi chưa thử nghiệm điều này nhưng bạn có thể muốn thử ví dụ triển khai truy vấn tùy chỉnh sau:
public interface UserRepository extends MongoRepository<User, String> {
@Query(value = "{ 'createdAt' : {$gte : ?0, $lte: ?1 }}")
public ArrayList<User> findbyCreatedAtBetween(Date from, Date to);
}
Nếu cách trên không hiệu quả với bạn, hãy tạo giao diện tùy chỉnh và lớp triển khai của bạn để thực hiện truy vấn tùy chỉnh. Ví dụ:tạo một giao diện có tên thêm vào Custom
:
public interface UserRepositoryCustom {
public List<User> findbyCreatedAtBetween(Date from, Date to);
}
Sửa đổi UserRepository
và thêm UserRepositoryCustom
giao diện được mở rộng:
@Repository
public interface UserRepository extends UserRepositoryCustom, MongoRepository {
}
Tạo lớp triển khai của bạn để triển khai các phương thức được xác định trong UserRepositoryCustom
giao diện.
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));
}
}