MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Dynamische MongoRepository-Abfragen

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 :).

  1. 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);
}
  1. 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())
        );
    }
}
  1. 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);
    }
}
  1. 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