Robbo_UK
Robbo_UK

Reputation: 12149

Spring mongo repository crud combined with criteria

I have the following two repository classes in my project.

@Repository
public interface AuditRepository extends MongoRepository<AuditEntity, String> {
}

And also one that has more complex queries.

@Service
public class AuditCriteriaRepository {

  private final MongoTemplate mongoTemplate;

  public AuditCriteriaRepository(MongoTemplate mongoTemplate){
    this.mongoTemplate = mongoTemplate;
  }


  public List<AuditEntity > getAuditEntitiesByStatus(AuditStatus auditStatus, Instant instant){
    Query query = new Query();
    query.addCriteria(Criteria.where("status")
        .is(auditStatus)
    ).addCriteria(Criteria.where("createdAt").lt(instant));
    return mongoTemplate.find(query, AuditEntity.class);
  }
}

The problem I have now is they are Autowired as separate classes and I would prefer if I could combine the two as one repository class so I can have the default crud options and build criteria ones also.

Any advice / tips on how to do that?

Upvotes: 1

Views: 4816

Answers (1)

Dimitri Mestdagh
Dimitri Mestdagh

Reputation: 44745

If you don't want to autowire two different classes, you can extend your repository with your custom calls.

For example, let's say you created an additional interface called AuditCriteriaRepository, containing:

public interface AuditCriteriaRepository {
    List<AuditEvent> getAuditEntitiesByStatus(AuditStatus auditStatus, Instant instant);
}

After that, you can extend your AuditRepository with the new interface:

public interface AuditRepository extends MongoRepository<AuditEntity, String>, AuditCriteriaRepository {
}

Additionally, you'll have to implement AuditCriteriaRepository using the code you wrote:

public class AuditCriteriaRepositoryImpl implements AuditCriteriaRepository {

  private final MongoTemplate mongoTemplate;

  public AuditCriteriaRepository(MongoTemplate mongoTemplate){
    this.mongoTemplate = mongoTemplate;
  }


  public List<AuditEntity > getAuditEntitiesByStatus(AuditStatus auditStatus, Instant instant){
    Query query = new Query();
    query.addCriteria(Criteria.where("status")
        .is(auditStatus)
    ).addCriteria(Criteria.where("createdAt").lt(instant));
    return mongoTemplate.find(query, AuditEntity.class);
  }
}

Now you can autowire AuditRepository and call getAuditEntitiesByStatus() directly on the repository itself.

Upvotes: 5

Related Questions