Spring mongo 存储库 crud 与条件相结合
Spring mongo repository crud combined with criteria
我的项目中有以下两个存储库 class。
@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);
}
}
我现在遇到的问题是它们是作为单独的 classes 自动装配的,我更愿意将两者合并为一个存储库 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()
。
我的项目中有以下两个存储库 class。
@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);
}
}
我现在遇到的问题是它们是作为单独的 classes 自动装配的,我更愿意将两者合并为一个存储库 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()
。