2013-07-08 2 views
5

У меня возникла проблема с запросом обновления с использованием Spring Data MongoDB. Я извлекаю объект _id как значение BigInteger. Тогда я хочу сделать следующий запрос:Данные Spring MongoDB: преобразование BigInteger в ObjectId

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

Query часть не совпадает никаких документов с момента значение идентификатора, переданного is() каким-то образом должны быть преобразованы в ObjectId. Я не могу найти документацию по этому виду конверсии. Поблагодарите любую помощь.

p.s .: SpringData MongoDB версия 1.2

+0

Я также вижу, что вы пытаетесь выполнить какое-то управление версиями. Я хотел бы направить вас [этот вопрос] (http://stackoverflow.com/questions/16665797/spring-data-version-annotation-not-incrementing-when-used-on-a-mongo-collection), что я попросил повторного аудита с весенним монго, так как он также настраивал автоматическое управление версиями с помощью аннотаций. –

+0

Спасибо, но я достаточно доволен своим версированием :-) –

ответ

1

Вы, вероятно, хотите написать собственный Spring конвертер BigInteger => ObjectId и ObjectId => BigInteger.

Смотрите РОУ часть здесь: http://static.springsource.org/spring-data/data-document/docs/current/reference/html/#d0e2670

------ ОБНОВЛЕНИЕ ------

Похоже, что этот вид преобразователя уже существует в Спринг-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.

+0

Легче сказать, чем делать :-). Я нашел этот класс в документации до версии 1.0 Spring Data. Но, я упомянул версию данных Spring по той причине, насколько я вижу, в этом нет такого конвертера в 1.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» будет хранить идентификатор как Монго ObjectId, поэтому избавляя вас от делать преобразование самостоятельно.

+1

Вы получаете что-то неправильно. У меня есть @Id в поле BigInteger в моей сущности. И Spring Data действительно сохраняет этот BigInt как ObjectId. Но ... Проблема заключается не в сохранении, а в передаче значения Query. –

+0

@AleksandrKravets Хорошо, тогда все, что вам нужно сделать в вашем запросе, заменяет «_id» тем, что имя вашего аннотированного поля было названо: i.e.если ваше поле id называется «id», как в моем примере, просто измените критерии следующим образом: Criteria.where («id»). is (id) –

+0

Нет, не работает. Как я уже упоминал, проблема не в названии поля. Это тип ценности и отсутствие автоматического преобразования. –

6

Вы можете преобразовать его также вручную:

ObjectId convertedId = new ObjectId(bigInteger.toString(16)); 
Query query = new Query(Criteria.where("_id").is(convertedId)); 
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); 
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)); 
Смежные вопросы