2013-07-08 8 views
5

J'ai un problème avec la requête de mise à jour en utilisant Spring Data MongoDB. Je récupère le _id d'un objet en tant que valeur BigInteger. Ensuite, je veux faire requête suivante:Spring Data MongoDB: conversion BigInteger en ObjectId

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

partie de la requête ne correspond à aucun document depuis identifiant est passé à is() doit en quelque sorte être converti en ObjectId. Je ne trouve aucune documentation sur ce type de conversion. Appréciera toute aide.

p.s .: version SpringData MongoDB 1.2

+0

Je vois également que vous essayez d'effectuer une sorte de versionnage. Je voudrais vous renvoyer tho [cette question] (http://stackoverflow.com/questions/16665797/spring-data-version-annotation-not-incrementing-when-used-on-a-mongo-collection) que je demandé de re-auditing avec Spring mongo, car il permet également de configurer le versioning automatique en utilisant des annotations. –

+0

Merci, mais je suis assez content de mon versioning :-) –

Répondre

1

Vous voulez probablement écrire un convertisseur de ressort personnalisé BigInteger => ObjectId et ObjectId => BigInteger.

Voir la partie doc ici: http://static.springsource.org/spring-data/data-document/docs/current/reference/html/#d0e2670

------ ------ MISE À JOUR

Il semble que ce genre de convertisseur existe déjà au printemps-Data- Bibliothèque MongoDB: http://static.springsource.org/spring-data/data-document/docs/1.0.0.M1/api/org/springframework/data/document/mongodb/SimpleMongoConverter.ObjectIdToBigIntegerConverter.html

Vous devez simplement le spécifier dans votre configuration Spring.

+0

C'est plus facile à dire qu'à faire :-). J'ai trouvé cette classe dans la documentation à la version 1.0 de Spring Data. Mais, j'ai mentionné Spring version des données pour une raison - pour autant que je vois, il n'y a pas un tel convertisseur en 1.2. –

1

Sinon, vous pouvez ajouter un champ « id » à vos classes de collection ou potentiellement une classe de base et annoter avec org.springframework.data.annotation.Id, comme ci-dessous:

import org.springframework.data.annotation.Id; 

public abstract class BaseDocument { 

    @Id 
    protected long id; 

Cela vous permettra pour exécuter les requêtes de la forme:

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

Annoter votre propre champ id avec « @Id » stockera votre identifiant comme mongo objectId donc vous évite de faire la conversion vous-même.

+1

Vous obtenez quelque chose de mal. J'ai un champ @Id sur BigInteger dans mon entité. Et Spring Data enregistre vraiment ce BigInt comme ObjectId. Mais ... Le problème n'est pas de sauver, mais de passer de la valeur à Query. –

+0

@AleksandrKravets Bien, alors tout ce que vous devez faire dans votre requête est de remplacer '_id' par ce que votre champ annoté est nommé: i.e.Si votre champ id est nommé "id" comme dans mon exemple, changez juste vos critères comme suit: Criteria.where ("id"). est (id) –

+0

Non, n'a pas fonctionné. Comme je l'ai mentionné en question, le problème n'est pas au nom du champ. C'est dans le type de valeur et le manque de conversion automatique. –

6

Vous pouvez le convertir également manuellement:

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

Vous pouvez convertir un BigIngeter-ObjectId en utilisant la représentation hexadécimale du BigInteger. Cependant, un ObjectId est censé avoir exactement 24 caractères, et l'analyse d'une chaîne plus courte échouera en Java. Il est donc préférable de s'assurer que la représentation hexadécimale est correctement complétée:

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