我有一个列表类 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
}
如何解决这些问题?
对于复合键,您需要这样构建查询:
db.product.aggregate([
{
$match: {
$or: [
{
$and: [
{
"_id.productId": 872223334
},
{
"_id.categoryCode": 4
}
]
},
{
$and: [
{
"_id.productId": 872223335
},
{
"_id.categoryCode": 5
}
]
}
]
}
}
])