Reputation: 12149
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
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