Spring Data MongoDB:BigInteger到ObjectId的转换

时间:2013-07-08 15:31:07

标签: java mongodb spring-data-mongodb

我在使用Spring Data MongoDB进行更新查询时遇到问题。我将一些对象的_id检索为BigInteger值。然后我想进行以下查询:

Query query = new Query(Criteria.where("_id").is(id));
Update update = new Update();
update.set("version",version);
mongoOperations.updateFirst(query, update, Audit.class);

查询部分无法匹配任何文档,因为传递给is()的id值必须以某种方式转换为ObjectId。我找不到关于这种转换的任何文档。将不胜感激任何帮助。

p.s。:SpringData Mongodb 1.2版

5 个答案:

答案 0 :(得分:6)

您也可以手动转换它:

ObjectId convertedId = new ObjectId(bigInteger.toString(16));
Query query = new Query(Criteria.where("_id").is(convertedId));

答案 1 :(得分:1)

您可能想要编写自定义Spring转换器BigInteger => ObjectId和ObjectId =>的BigInteger。

请参阅此处的doc部分: http://static.springsource.org/spring-data/data-document/docs/current/reference/html/#d0e2670

------更新------

似乎这种转换器已经存在于Spring-Data-MongoDB库中: http://static.springsource.org/spring-data/data-document/docs/1.0.0.M1/api/org/springframework/data/document/mongodb/SimpleMongoConverter.ObjectIdToBigIntegerConverter.html

所以你只需要在Spring配置中指定它。

答案 2 :(得分:1)

或者,您可以在集合类或可能的基类中添加“id”字段,并使用org.springframework.data.annotation.Id对其进行注释,如下所示:

import org.springframework.data.annotation.Id;

public abstract class BaseDocument {

    @Id
    protected long id;

这将允许您执行表单的查询:

public boolean doesDocumentExist(Class clazz, long documentId) {
    Query queryCriteria = new Query(Criteria.where("id").is(documentId));
    return mongoTemplate.count(queryCriteria, clazz) == 1;
}

使用'@Id'注释您自己的id字段会将您的id存储为mongo objectId,从而避免您自己进行转换。

答案 3 :(得分:0)

//get the converter from the mongoTemplate

MappingMongoConverter converter = (MappingMongoConverter)mongoTemplate.getConverter();

//get the conversion service from the mongo converter

ConversionService conversionService = converter.getConversionService();

//iterate the status list and get the each id to add the arraylist

for(Status status: statusList){

    ObjectId objectIdVal = conversionService.convert(status.getId(), ObjectId.class);

    **//here status.getId() returns the BigInteger**
    statusArrayList.add(objectIdVal);           
}

//get the users list whose status is active  and cancel

query.addCriteria(new Criteria().where("status.$id").in(statusArrayList));

List<User> usersList = mongoTemplate.find(query, User.class);

答案 4 :(得分:0)

您可以使用BigIngeter的十六进制表示将ObjectId转换为BigInteger。但是,ObjectId应该是24个字符长,解析较短的字符串将在Java中失败。因此,最好确保十六进制表示适当地填充0:

String hexString24 = StringUtils.leftPad(bigInteger.toString(16), 24, "0");
ObjectId convertedId = new ObjectId(hexString24);
Query query = new Query(Criteria.where("_id").is(convertedId));