gpt4 book ai didi

java - 在 Spring data mongodb 中从同一个 POJO 创建两个集合

转载 作者:太空宇宙 更新时间:2023-11-04 10:30:39 25 4
gpt4 key购买 nike

用例:我想要两个具有相同字段的集合。一个集合将包含最近的数据(例如 15 天),而其他集合则包含旧数据(例如最近 6 个月)。我想用单个 POJO 来实现这一点,因为根据日期进行查询然后将其转换为 VO 会更容易。

底线:我想从 1 个 POJO 创建 2 个集合。

请提出建议。

最佳答案

我也遇到了同样的问题。我认为这并不容易做到,因为集合名称是在 POJO 上的 @Document 注释中设置的。可以通过使用 SpEL 表达式动态更改它(参见例如 How To Configure MongoDb Collection Name For a Class in Spring Data ),并且有一些示例可以将其用于 multi-tenancymultiple principles 但我不知道如何在编译时使用它来从同一类创建两个不同的 bean。据我所知这是不可能的。

我可以提供可能的解决方案,但两者都很丑陋。

  1. 这是我实际使用的解决方法。为文档创建子类并将实际逻辑放入父类中

父类

@Getter
@FieldDefaults(makeFinal=true, level= AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@ToString
@EqualsAndHashCode
public class CommonParent {

@Id
@Delegate
HourlySiteWaiterRevenue.Key key;
long count;
@Field(targetType = FieldType.DECIMAL128)
BigDecimal sum;

@CompoundIndex
@Value
public static class Key implements Serializable {
@NonNull UUID entityId;
@NonNull Instant timestamp;
}
}

存储库的实际模型

@Document
public class UseThisForRepository extends CommonParent{
public UseThisForRepository(@NonNull @JsonProperty("key") CommonParent.Key key,
@NonNull @JsonProperty("count") long count,
@NonNull @JsonProperty("sum") BigDecimal sum,) {
super(key, count, sum);
}
}

存储库的模型完全由样板代码组成,必须多次复制粘贴这些代码,以便您可以拥有多个 @Document 注释。默认情况下,这将使用子类名称作为集合名称,但可以在任何地方进行配置。

  • mongoTemplate 原则上具有集合名称的重载。可以在 mongoTemplate 中配置集合名称(例如,参见 https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo-template )。应该可以有不同的集合名称并使用它们。但是,我想不出如何在 Spring 从 @Repository 接口(interface)自动生成的类中使用这个名称。您可以覆盖 RepositoryCustom 实现中的每个存储库方法,但您也可以根本不使用 @Repository
  • 关于java - 在 Spring data mongodb 中从同一个 POJO 创建两个集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50041391/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com