Var*_*ave 6 java mongodb spring-data-mongodb
我正在尝试使用 Spring Data - Mongo 模板基于 UUID 进行查询。生成的查询不会返回预期的文档。当我尝试使用 new BinData(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;
...
}
Run Code Online (Sandbox Code Playgroud)
下面是自定义存储库的实现方法。
...
Query findPersonQuery = new Query();
findPersonQuery.addCriteria(Criteria.where("_id").is(personId));
final Person person = mongoTemplate.find(findPersonQuery, Person.class);
// process and return person after
....
Run Code Online (Sandbox Code Playgroud)
当我传入 UUID 时,上面的代码似乎会生成一个解析的查询。UUID 为 a02b2900-b871-11e9-a2a3-2a2ae2dbcce4
{ "_id" : { "$eq" : { "$binary" : "6RFxuAApK6DkzNviKiqjog==", "$type" : "03" } } }
Run Code Online (Sandbox Code Playgroud)
当我在 mongo shell 中运行它时,它什么也没有返回。在存储库中它什么也不返回。
但是,当我在 mongo shell 中输入以下查询时,我得到了正确的 person 对象
db.getCollection('person').find({ "_id" : new BinData(3, "6RFxuAApK6DkzNviKiqjog==")})
Run Code Online (Sandbox Code Playgroud)
我期望生成的查询返回 UUID 为 a02b2900-b871-11e9-a2a3-2a2ae2dbcce4 的人
问题:
我知道我们可以做类似 BasicQuery 的事情,如下所示,但有没有办法避免它,因为我们现在必须提供 Base 64 的自定义编码器,而不是允许 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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2313 次 |
| 最近记录: |