【问题标题】:Spring mongo repository crud combined with criteriaSpring mongo 存储库 crud 结合标准
【发布时间】:2019-08-08 14:06:19
【问题描述】:

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

@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 选项并构建标准选项。

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

【问题讨论】:

  • 一个建议是在AuditRepository 本身中创建自定义查询(使用@Query 注释)。是否真的需要使用第二个存储库中的 MongoTemplate?否则,您必须继续使用单独的存储库类。

标签: java mongodb spring-boot jpa-2.0


【解决方案1】:

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

例如,假设您创建了一个名为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()

【讨论】:

  • 哪些类需要注释?只是 AuditRepository 接口上的@repository?
  • 我认为您根本不需要任何注释。
  • 你是对的,你不需要它。很好的答案谢谢
  • 大家好,我注意到getAuditEntitiesByStatus()这个方法,不能任意命名,否则在应用程序启动过程中会出错。有没有办法给它一个任意的名字?
  • 作为@Bruce,我遇到了PropertyReferenceException:找不到类型{Class}的属性{method name}!自定义存储库的行为类似于 Spring Data MongoRepository,并期望方法匹配特定的名称模式,以便它可以转换为查询。将其命名为“查找”或“获取”或任何其他名称对我不起作用。
猜你喜欢
  • 1970-01-01
  • 2014-02-03
  • 2019-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多