当前位置: 首页 > 知识库问答 >
问题:

如何使用spring data repository for mongodb从具有动态字段名的mongo存储库中获取数据?

韶兴德
2023-03-14

我正在使用spring数据JPA从mongoDB获取数据

public interface SupplierResponseRepo extends MongoRepository<SupplierResponse, String>  {}

@Document
public class SupplierResponse{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private String supplierResponseId;
    private String orderId;
    private String orderName;
}

上面的代码在所有字段名称固定之前一直有效,现在可以有多个字段,并且它们的名称事先未知,我希望提取所有字段。是否有任何方法可以做到同样的事情,比如我可以将任何泛型类型传递给MongoRepository接口并获取所有列。

我也有同样的问题,但后来它被解决使用DBObject.

mongoTemplate.find(query, DBObject.class,"supplier");

MongoRepository是否也有类似的替代方案?

共有1个答案

刘和玉
2023-03-14

您可以使用自定义转换器类使用MongoRepository获取数据。由于您需要在Spring数据应用程序中映射来自Mongodb的数据,因此您需要一个ReadingConverter。

/**
 * @ReadingConverter: Spring data mongodb annotation to enable the class to handle the mapping of DBObject into Java
 * Objects
 */
@ReadingConverter
public class SupplierResponseConverter implements Converter<Document, SupplierResponse> {
    /**
     * Map DBObject to SupplierResponse inherited class according to the MongoDB document attributes
     * @param source MongoDB Document object
     * @return SupplierResponse Object
     */
    @Override
    public SupplierResponse convert(Document source) {
        if (source.get("supp_id") != null) {
            SupplierResponse supplierResponse = new SupplierResponse();
            supplierResponse.setSupplierId(source.get("supp_id", String.class)
        }
        //repeat this operation for all your attribute in order to map them according to a condition of your choice
}

然后,需要在配置类中启用自定义转换器类。你可以这样做。通过扩展AbstractMongoConfiguration,您将不得不覆盖其他一些方法。

/**
 * @Configuration: allow to register extra Spring beans in the context or import additional configuration classes
 */
@Configuration
public class DataportalApplicationConfig extends AbstractMongoConfiguration {

    //@Value: inject property values into components
    @Value("${spring.data.mongodb.uri}")
    private String uri;
    @Value("${spring.data.mongodb.database}")
    private String database;

    /**
     * Configure the MongoClient with the uri
     *
     * @return MongoClient.class
     */
    @Override
    public MongoClient mongoClient() {
        return new MongoClient(new MongoClientURI(uri));
    }

    /**
     * Database name getter
     *
     * @return the database the query will be performed
     */
    @Override
    protected String getDatabaseName() {
        return database;
    }

    /**
     * @Bean: explicitly declare that a method produces a Spring bean to be managed by the Spring container.
     * Configuration of the custom converter defined for the entity schema.
     * @return MongoCustomConversions.class
     */
    @Bean
    @Override
    public MongoCustomConversions customConversions() {
        List<Converter<?, ?>> converterList = new ArrayList<>();
        converterList.add(new ContactReadConverter());
        converterList.add(new GeometryGeoJSONReadConverter());
        converterList.add(new SamplingFeatureReadConverter());
        converterList.add(new SensorReadConverter());
        return new MongoCustomConversions(converterList);
    }

    /**
     * @Bean: explicitly declare that a method produces a Spring bean to be managed by the Spring container.
     * Configuration of the MongoTemplate with the newly defined custom converters. The MongoTemplate class is the
     * central class of Spring’s MongoDB support and provides a rich feature set for interacting with the database. The
     * template offers convenience operations to create, update, delete, and query MongoDB documents and provides a
     * mapping between your domain objects and MongoDB documents.
     *
     * @return MongoTemplate.class
     */
    @Bean
    @Override
    public MongoTemplate mongoTemplate() {
        MongoTemplate mongoTemplate = new MongoTemplate(mongoClient(), getDatabaseName());
        MappingMongoConverter mongoMapping = (MappingMongoConverter) mongoTemplate.getConverter();
        mongoTemplate.setWriteResultChecking(WriteResultChecking.EXCEPTION);
        mongoTemplate.setWriteConcern(WriteConcern.MAJORITY);
        mongoMapping.setCustomConversions(customConversions()); // tell mongodb to use the custom converters
        mongoMapping.afterPropertiesSet();
        return mongoTemplate;
    }
}
 类似资料:
  • 问题内容: 我有许多具有不同数量属性的不同对象。到目前为止,我已经将数据保存在XML文件中,该文件很容易允许数量不断变化的属性。但是我正在尝试将其移至数据库。 您首选的存储数据方式是什么? 到目前为止,我已经确定了一些策略: 在对象表中只有一个名为“属性”的字段,并在其中存储序列化或json化的数据。 将数据存储在两个表(对象,属性)中,并使用第三个表保存关系,使其成为真正的n:m关系。非常干净的

  • 我有一个avro架构,我想从中提取所有字段名称。有什么办法可以做到这一点吗? 测试架构是这样的: 这是代码: 以上是这样打印出来的: 但我希望它只返回数组列表中的“左”和“右”,而不返回其他内容。现在,它还返回类型和pos,我不需要它们。有什么办法可以做到吗?

  • 问题内容: 我正在尝试运行一个容器,该容器将公开私有GitHub存储库上的软件包中的golang服务。 由于我与GCE合作,因此我的入门图片是google / debian:wheezy。 安装所有必需的依赖项和工具后,我正在运行 包裹是私人仓库。 我添加了GitHub SSH密钥以允许从私有存储库克隆到docker文件: 尽管如此,当go尝试克隆存储库时,我在go get流程中遇到了一个错误:

  • 我有这个生成动态字段的示例代码。 我的问题是我不知道如何将数据插入数据库。 我尝试过内爆,但结果不是我想要的格式。 这是我的专栏(id、姓名、糖果、水果、饮料) 所以如果我生成3行,它应该像这样插入 事实上,我不知道这是否可能。谢啦 小提琴 https://jsfiddle.net/jqj1h4vb/2/

  • 问题内容: 我发现了Java:查找方法的所有调用者–获取所有调用特定方法的方法,这提示如何查找特定方法的所有调用者。 那么,如何获得静态字段的用户呢? 例如,当我有静态的,并且它与访问,如何获得 ? 问题答案: 该示例基于org.eclipse.jdt.internal。*类,由于JDT SearchEngine API具有全功能,因此我认为您无需花费太多精力。就您而言,下面的代码就足够了:

  • 问题内容: 我需要将字典保存在模型字段中。我怎么做? 例如,我有此代码: 我应该为“ bill_products =“写什么,以便从我的产品模型到此帐单保存一些随机产品? 这是账单的模型说明: 以及产品的型号说明: 如果还有什么我要补充的请发表评论。谢谢! 问题答案: 我刚刚发现了django-jsonfield软件包,该软件包 是可重用的Django字段,可让您在模型中存储经过验证的JSON。