【问题标题】:Spring Data MongoDB - Long values are coming null in response using Repository querySpring Data MongoDB - 使用存储库查询响应长值变为空
【发布时间】: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&lt;PurchaseOrder, ObjectId&gt;。你甚至不需要@Query,你可以使用,findByUser_id(Long id)。下划线 (_) 用于进入对象内部。并且它的可读性
  • 由于你使用的是spring boot和它处理依赖注入,PurchaseOrderService接口是多余的,你可以去掉它,你可以直接在控制器中注入服务类。

标签: spring mongodb spring-boot spring-data-mongodb


【解决方案1】:

得到null的原因,mongodb默认的id字段是_id。并且spring数据在任何类中都将id转换为_id。尝试运行时,可以查看控制台find using query: { "user._id" : 1} fields: Document{{}}。它提到_id也没有映射到数据库,数据库有id。 (没有下划线)。要解决这个问题,你可以使用@Field。

public class User {
    @Field("id")
    private Long id;
    private String firstname;
    private String lastname;
    private String email;
}

或者你可以在任何地方使用_id(在类和集合中)

【讨论】:

  • 感谢您的详细回复,代码仍然无法正常工作,您可以试试吗?我已经发布了所有代码
  • 我已经尝试过您提供并检查过的内容(不是 git)。我也会检查 git 代码。给我一些时间
  • 我还没有安装 gradle,我正在使用 maven,使用你的代码,它对我来说工作正常。邮递员 img ibb.co/60tSPr7 。检查您是否在用户中添加了@Field("id")
  • 在 git 中注意到 @Query("{ 'user.userId': ?0 }") 应该是 @Query("{ 'user.id': ?0 }")
  • 谢谢,它现在只能为 _id 字段获得"_id": { "timestamp": 1621440065, "date": 1621440065000 },
猜你喜欢
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 2014-09-11
  • 2013-03-14
  • 1970-01-01
相关资源
最近更新 更多