【发布时间】:2021-05-19 16:21:00
【问题描述】:
我正在使用V2.4.5 开发Spring Boot MongoDB 示例。在此示例中,当我进行存储库查询时,未映射长字段值。来自 MongoDB 的示例文档值。
{
"_id" : ObjectId("60a536412306ab5bdd7a6b06"),
"user" : {
"id" : 1,
"firstname" : "vins",
"lastname" : "guru",
"email" : "admin@vinsguru.com"
},
"product" : {
"id" : 1,
"description" : "ipad"
},
"price" : 300
}
OrderController.java
@RestController
@RequestMapping("/order-service")
public class OrderController {
@Autowired
private PurchaseOrderService purchaseOrderService;
@GetMapping("/all")
public List<PurchaseOrder> getAllOrders() {
return this.purchaseOrderService.getPurchaseOrders();
}
@PostMapping("/create")
public void createOrder(@RequestBody PurchaseOrder purchaseOrder) {
this.purchaseOrderService.createPurchaseOrder(purchaseOrder);
}
}
PurchaseOrderServiceImpl.java
@Service
public class PurchaseOrderServiceImpl implements PurchaseOrderService {
@Autowired
private PurchaseOrderRepository purchaseOrderRepository;
@Override
public List<PurchaseOrder> getPurchaseOrders() {
return this.purchaseOrderRepository.findAll();
}
@Override
public void createPurchaseOrder(PurchaseOrder purchaseOrder) {
this.purchaseOrderRepository.save(purchaseOrder);
}
}
PurchaseOrder.java
@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
@Document(collection = "purchase_order")
public class PurchaseOrder {
@Id
private Long id;
private User user;
private Product product;
private double price;
}
用户.java
@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
public class User {
private Long id;
private String firstname;
private String lastname;
private String email;
}
Product.java
@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
public class Product {
private Long id;
private String description;
}
我得到的输出是
{
"_id" : ObjectId("60a536412306ab5bdd7a6b06"),
"user" : {
"id" : null,
"firstname" : "vins",
"lastname" : "guru",
"email" : "admin@vinsguru.com"
},
"product" : {
"id" : null,
"description" : "ipad"
},
"price" : 300
}
PurchaseRepository.java
public interface PurchaseOrderRepository extends MongoRepository<PurchaseOrder, String> {
@Query("{ 'user.id': ?0 }")
List<PurchaseOrder> findByUserId(Long userId);
}
【问题讨论】:
-
只是好奇,你试过整数吗?或者你能告诉我保存在db中的数据类型是什么?
-
再次检查您的数据库,id 是 ObjectId 还是 Long? (int32/int64)。这意味着,您尝试将 ObjectId 转换为 Long
-
请也发布存储库
-
我注意到了一些问题,您在 purchesedOrder 中将 Long 定义为 id。但它在数据库中保存为 ObjectId。所以更好的是,您可以将其设置为
private ObjectId _id;,否则您可以编写自定义转换器,或者您甚至可以设置器将值设置为 id。如果要使用 ObjectId,则将字符串更改为MongoRepository<PurchaseOrder, ObjectId>。你甚至不需要@Query,你可以使用,findByUser_id(Long id)。下划线 (_) 用于进入对象内部。并且它的可读性 -
由于你使用的是spring boot和它处理依赖注入,
PurchaseOrderService接口是多余的,你可以去掉它,你可以直接在控制器中注入服务类。
标签: spring mongodb spring-boot spring-data-mongodb