Di bawah ini adalah solusi yang saya buat. Jadi hanya untuk rekap, masalah yang saya miliki, adalah bahwa saya tidak dapat menjalankan kueri yang diberikan objek Kueri sebagai input untuk meningkatkan fleksibilitas atas kriteria pemfilteran. Solusinya ternyata cukup sederhana, saya hanya perlu membaca dokumentasi dengan cermat :).
- langkah
Perluas MongoRepository dan tambahkan fungsi khusus Anda:
@NoRepositoryBean
public interface ResourceRepository<T, I extends Serializable> extends MongoRepository<T, I> {
Page<T> findAll(Query query, Pageable pageable);
}
- langkah
Buat implementasi untuk antarmuka ini:
public class ResourceRepositoryImpl<T, I extends Serializable> extends SimpleMongoRepository<T, I> implements ResourceRepository<T, I> {
private MongoOperations mongoOperations;
private MongoEntityInformation entityInformation;
public ResourceRepositoryImpl(final MongoEntityInformation entityInformation, final MongoOperations mongoOperations) {
super(entityInformation, mongoOperations);
this.entityInformation = entityInformation;
this.mongoOperations = mongoOperations;
}
@Override
public Page<T> findAll(final Query query, final Pageable pageable) {
Assert.notNull(query, "Query must not be null!");
return new PageImpl<T>(
mongoOperations.find(query.with(pageable), entityInformation.getJavaType(), entityInformation.getCollectionName()),
pageable,
mongoOperations.count(query, entityInformation.getJavaType(), entityInformation.getCollectionName())
);
}
}
- langkah
Tetapkan implementasi Anda sebagai implementasi MongoRepository default:
@EnableMongoRepositories(repositoryBaseClass = ResourceRepositoryImpl.class)
public class MySpringApplication {
public static void main(final String[] args) {
SpringApplication.run(MySpringApplication.class, args);
}
}
- langkah
Buat repositori untuk objek kustom Anda:
public interface CustomObjectRepo extends ResourceRepository<CustomObject, String> {
}
Sekarang jika Anda memiliki banyak objek yang ingin Anda simpan di penyimpanan dokumen mongo, cukup dengan mendefinisikan antarmuka yang memperluas ResourceRepository
Anda (seperti yang terlihat pada langkah 4), dan Anda akan memiliki Page<T> findAll(Query query, Pageable pageable)
metode kueri khusus. Saya menemukan solusi ini sebagai solusi paling elegan yang pernah saya coba.
Jika Anda memiliki saran untuk perbaikan, silakan bagikan dengan komunitas.
Salam, Cristian