Search code examples
springmongodbspring-bootspring-data-mongodb

Spring Data MongoDB - Long values are coming null in response using Repository query


I am developing Spring Boot MongoDB example using V2.4.5. In this example when I am doing repository query, Long fields values are not getting mapped. Sample document value from 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;
}

User.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;
}

Output I am getting is

{
    "_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);
}

enter image description here


Solution

  • The reason why you get null, Mongodb default field of id is _id. And spring data converts id to _id in any classes. When you try to run, you can check the console find using query: { "user._id" : 1} fields: Document{{}}. It mentioned _id there also which is not mapped to database, database has id. (No underscore). To over come this problem ,you can use @Field.

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

    Or you can use _id everywhere(In classes and collections)