Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MongoDb spring数据查询二进制和UUID_Java_Mongodb_Spring Data Mongodb - Fatal编程技术网

Java MongoDb spring数据查询二进制和UUID

Java MongoDb spring数据查询二进制和UUID,java,mongodb,spring-data-mongodb,Java,Mongodb,Spring Data Mongodb,我正在尝试使用Spring Data-Mongo模板基于UUID进行查询。生成的查询不会返回预期的文档。当我尝试使用newbindata(type,base64)在shell中运行查询时,它返回文档。生成的查询a使用{“$binary”:“base64”,“$type”:“03}作为匹配筛选器 我有一个id配置为UUID类型的对象 @Data @NoArgsConstructor @Document(collection = "person") public class Person {

我正在尝试使用Spring Data-Mongo模板基于UUID进行查询。生成的查询不会返回预期的文档。当我尝试使用newbindata(type,base64)在shell中运行查询时,它返回文档。生成的查询a使用{“$binary”:“base64”,“$type”:“03}作为匹配筛选器

我有一个id配置为UUID类型的对象

@Data
@NoArgsConstructor
@Document(collection = "person")
public class Person {
   @Id
   private UUID id;

   private String firstName;

   private String lastName;
   ...
}
下面是自定义存储库实现方法

...
Query findPersonQuery = new Query();

        findPersonQuery.addCriteria(Criteria.where("_id").is(personId));

        final Person person = mongoTemplate.find(findPersonQuery, Person.class);
// process and return person after
....

当我传入UUID时,上面的代码似乎生成了一个解析查询。UUID是a02b2900-b871-11e9-a2a3-2AE2AE2DBCCE4

{ "_id" : { "$eq" : { "$binary" : "6RFxuAApK6DkzNviKiqjog==", "$type" : "03" } } }
当我在mongo shell中运行它时,它不会返回任何内容。在存储库中,它不会返回任何内容

但是,当我将以下查询放入MongoShell中时,我得到了正确的person对象

db.getCollection('person').find({  "_id" : new BinData(3, "6RFxuAApK6DkzNviKiqjog==")})
我希望生成的查询返回UUID为a02b2900-b871-11e9-a2a3-2AE2ADBCCE4的人员

{ "_id" : { "$eq" : { "$binary" : "6RFxuAApK6DkzNviKiqjog==", "$type" : "03" } } }
问题:

  • 传入shell时,$binary运算符和BinData之间有什么区别
  • 如何获取spring数据和mongoTemplate以生成正确的查询。 2.1是否可以不编写自定义查询
  • 我知道我们可以做如下所示的BasicQuery之类的事情,但有没有办法避免它,因为我们现在必须提供Base64的自定义编码器,而不是允许JPA风格将UUID转换为持久层

    final ByteBuffer buffer = ByteBuffer.wrap(new byte[16]);
            buffer.putLong(personId.getMostSignificantBits());
            buffer.putLong(personId.getLeastSignificantBits());
            final String base64PersonId = Base64.encodeBase64String(buffer.array());
      final String query = String.format("{ _id: new BinData(3,\"%s\")}", JSONObject.escape(username), base64PersonId);
    
            return new BasicQuery(query);
    

    将UUID类型更改为对象:

    @Data
    @NoArgsConstructor
    @Document(collection = "person")
    public class Person {
       @Id
       private Object id;
    
       private String firstName;
    
       private String lastName;
       ...
    }
    

    在同一个问题上挣扎。例如,您:-)