代码之家  ›  专栏  ›  技术社区  ›  geco17

spring数据mongodb jpa find by id with composite id

  •  0
  • geco17  · 技术社区  · 6 年前

    我将mongodb与springboot结合使用,并且我有一个带有自定义 _id ,如是(在Java中):

    @Document(collection="myEntity")
    public class MyEntity {
        @Id
        private MyId id;
        private String field1;
        // getters, setters
        public static class MyId {
            private long field1;
            private String field2;
            private String field3;
            // getters, setters
        }
    
    }
    

    在mongo存储库中,我有一个 findById(MyId) save(MyEntity) MyId#id 字段被包装在 NumberLong .

    db.myEntity.find()
    

    将返回一个实体列表,如

    {
      "_id": {
        "field1": NumberLong("1"),
        "field2": "a",
        "field3": "b"
      },
      "field1": "aa"
    }
    

    另一方面,在启用mongodb查询的调试日志记录后 findById 方法显示

    使用查询完成 { "_id": { "field1": "$numberLong": "1", "field2": "a", "field3": "b" }, "field1": "aa" }

    在mongo shell中:

    db.myEntity.find({ "_id": { "field1": { "$numberLong": "1" }, "field2": "a", "field3": "b" }, "field1": "aa" }) 没有结果。

    跑步 db.myEntity.find({ "_id": { "field1": new NumberLong("1"), "field2": "a", "field3": "b" }, "field1": "aa" }) 返回结果。

    我怎样才能解决这个问题 query方法有效(返回给定id的预期结果)?

    0 回复  |  直到 6 年前
        1
  •  0
  •   Ilias Mentz    6 年前

    我想你应该试着去推翻 .toString() 在你的自定义Id类。 MongoDB有一个不同的 .toString() 来自javaone(其中包含hashCode)。

        2
  •  -1
  •   geco17    6 年前

    希望这能帮助别人。jpa“find”在指定 @org.springframework.data.mongodb.repository.Query 像这样:

    @Query("{ '_id.field1': ?0, '_id.field2': ?1, '_id.field3': ?2}")
    Optional<MyEntity> find(long field1, String field2, String field3);