2013-07-08 21 views
5

Ho un problema con la query di aggiornamento utilizzando Spring Data MongoDB. Recupero _id di alcuni oggetti come valore di BigInteger. Poi voglio fare seguente query:Spring Data MongoDB: conversione BigInteger to ObjectId

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

parte di query non riesce a risultati in nessun documento dal valore id passato a is() in qualche modo deve essere convertito in ObjectId. Non riesco a trovare alcuna documentazione su questo tipo di conversione. Apprezzerà qualsiasi aiuto

P.S .: SpringData MongoDB versione 1.2

+0

Inoltre, si sta tentando di eseguire un tipo di controllo delle versioni. Vorrei farvi riferimento a [questa domanda] (http://stackoverflow.com/questions/16665797/spring-data-version-annotation-not-incrementing-when-used-on-a-mongo-collection) che I ha chiesto il re auditing con spring mongo, come anche per impostare il versioning automatico usando le annotazioni. –

+0

Grazie, ma sono abbastanza contento del mio versioning :-) –

risposta

1

probabilmente si vuole scrivere un convertitore Primavera personalizzato BigInteger => ObjectId e ObjectId => BigInteger.

vedere la parte doc qui: http://static.springsource.org/spring-data/data-document/docs/current/reference/html/#d0e2670

------ ------ UPDATE

Sembra che questo tipo di convertitore esiste già nella primavera-Data- Libreria MongoDB: http://static.springsource.org/spring-data/data-document/docs/1.0.0.M1/api/org/springframework/data/document/mongodb/SimpleMongoConverter.ObjectIdToBigIntegerConverter.html

Quindi è sufficiente specificarlo nella configurazione Spring.

+0

È più facile da dire che da fare :-). Ho trovato questa classe nella documentazione alla versione 1.0 di Spring Data. Ma, ho citato la versione dei dati di Spring per un motivo - per quanto vedo non c'è un tale convertitore in 1.2. –

1

In alternativa è possibile aggiungere un campo 'id' alle classi di raccolta o potenzialmente una classe base e annotare con org.springframework.data.annotation.Id, come di seguito:

import org.springframework.data.annotation.Id; 

public abstract class BaseDocument { 

    @Id 
    protected long id; 

Questo vi permetterà di per eseguire le query della forma:

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

Annotare il proprio campo id con '@Id' memorizza il proprio ID come il mongo objectId, quindi risparmiando dal fare la conversione da soli.

+1

Stai sbagliando qualcosa. Ho un IDI sul campo BigInteger nella mia entità. E Spring Data salva davvero quel BigInt come ObjectId. Ma ... Il problema non sta nel salvare, ma nel passare il valore a Query. –

+0

@AleksandrKravets Bene, allora tutto ciò che devi fare nella tua query è sostituire '_id' con qualsiasi nome il tuo ID annotato sul campo: i.e.se il tuo campo id è denominato "id" come nel mio esempio, modifica semplicemente i criteri come segue: Criteria.where ("id"). is (id) –

+0

No, non ha funzionato. Come ho menzionato in questione, il problema non è nel nome del campo. È nel tipo di valore e nella mancanza di conversione automatica. –

6

È possibile convertire anche manualmente:

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

è possibile convertire un BigIngeter-ObjectId utilizzando la rappresentazione esadecimale del BigInteger. Tuttavia, un ObjectId deve essere lungo esattamente 24 caratteri e l'analisi di una stringa più breve fallirà in Java. Quindi è meglio assicurarsi che la rappresentazione esadecimale sia corretta in 0:

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