Spring Boot 不会从复合主键查询中返回任何数据

问题描述 投票:0回答:1

我有一个列表类 ProductId 和 Product。我还有一个 Product 类的 ProductRepository。 ProductId 是复合主键。 如何为以下结构的复合 id 列表编写条件查询:

@Data
class ProductId{
    Long productId;
    Long categoryCode;
}
          
@Data
@Document(collection = "products")
class Product {
                
    @Id
    ProductId id; 
               
    Long productName: string;
    Long category;
    Long quantityInStock;
                
    @PersistenceCreator
    Product(ProductId id,Long productName,Long category,Long quantityInStock){
        this.id = id;
        this.productName= productName;
        this.category = category;
        this.quantityInStock = quantityInStock;

    }
}         

这是存储库定义


public interface ProductRepository extends MongoRepository<Product, ProductId> {
   
}

当我使用

创建查询时
Product id = productRepository.findById(id); // Returns Optional.empty

这也不会返回任何数据。,返回空列表


public List<Product> find(List<ProductId> ids) {                 
    Query query = new Query();
    Criteria criteria = Criteria.where("id").in(ids);
    query.addCriteria(criteria);
    List<Product> results = mongoTemplate.find(query, Product.class);
    return results;
}

这是从Studio 3T看到的景色


{
    "_id": {
         "productId": 872223334,
         "categoryCode": 4
    },
    "productName": "Decantor Jacket",
    "category": 'Plaid-Item',
    "quantityInStock": 4001
}

如何解决这些问题?

mongodb spring-boot spring-data-mongodb
1个回答
0
投票

对于复合键,您需要这样构建查询:

db.product.aggregate([
  {
    $match: {
      $or: [
        {
          $and: [
            {
              "_id.productId": 872223334
            },
            {
              "_id.categoryCode": 4
            }
          ]
        },
        {
          $and: [
            {
              "_id.productId": 872223335
            },
            {
              "_id.categoryCode": 5
            }
          ]
        }
      ]
    }
  }
])

Mongo游乐场

© www.soinside.com 2019 - 2024. All rights reserved.