Bellow ist die Lösung, die ich mir ausgedacht habe. Um es noch einmal zusammenzufassen, das Problem, das ich hatte, war, dass ich keine Abfrage ausführen konnte, wenn ein Abfrageobjekt als Eingabe gegeben war, um mehr Flexibilität bei den Filterkriterien zu haben. Die Lösung stellte sich als ziemlich einfach heraus, ich musste nur die Dokumentation sorgfältig lesen :).
- Schritt
Erweitert MongoRepository und fügt Ihre benutzerdefinierten Funktionen hinzu:
@NoRepositoryBean
public interface ResourceRepository<T, I extends Serializable> extends MongoRepository<T, I> {
Page<T> findAll(Query query, Pageable pageable);
}
- Schritt
Erstellen Sie eine Implementierung für diese Schnittstelle:
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())
);
}
}
- Schritt
Legen Sie Ihre Implementierung als standardmäßige MongoRepository-Implementierung fest:
@EnableMongoRepositories(repositoryBaseClass = ResourceRepositoryImpl.class)
public class MySpringApplication {
public static void main(final String[] args) {
SpringApplication.run(MySpringApplication.class, args);
}
}
- Schritt
Erstellen Sie ein Repository für Ihr benutzerdefiniertes Objekt:
public interface CustomObjectRepo extends ResourceRepository<CustomObject, String> {
}
Wenn Sie nun mehrere Objekte haben, die Sie in einem Mongo-Dokumentenspeicher speichern möchten, reicht es aus, eine Schnittstelle zu definieren, die Ihr ResourceRepository
erweitert (wie in Schritt 4 zu sehen), und Sie haben die Page<T> findAll(Query query, Pageable pageable)
zur Verfügung benutzerdefinierte Abfragemethode. Ich habe festgestellt, dass diese Lösung die eleganteste der Lösungen ist, die ich ausprobiert habe.
Wenn Sie Verbesserungsvorschläge haben, teilen Sie diese bitte mit der Community.
Viele Grüße, Cristian