我的项目中有以下两个存储库类。

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


还有一个查询更复杂的查询。

@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);
  }
}


我现在遇到的问题是它们是作为单独的类自动装配的,如果我可以将两者合并为一个存储库类,则我希望这样做,这样我就可以拥有默认的crud选项并构建标准选项。

任何建议/提示如何做到这一点?

最佳答案

如果您不想自动连接两个不同的类,则可以使用自定义调用扩展存储库。

例如,假设您创建了一个名为AuditCriteriaRepository的附加接口,其中包含:

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



之后,您可以使用新界面扩展AuditRepository

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


另外,您必须使用编写的代码实现AuditCriteriaRepository

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);
  }
}


现在,您可以自动连接AuditRepository并直接在存储库本身上调用getAuditEntitiesByStatus()

关于java - Spring Mongo Repository Crud与标准结合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57414523/

10-12 03:26