2013-07-08 13 views
5

SpringデータMongoDBを使用して更新クエリに問題があります。オブジェクトの_idをBigInteger値として取得します。それから私は、クエリを以下のようにしたい:is()に渡されたid値が何らかの形でのObjectIdに変換する必要がありますので、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); 

クエリ部分は、任意の文書を一致させるために失敗しました。私はこの種の変換についてのドキュメントを見つけることができません。助けていただければ幸いです。

p.s:SpringData MongoDBのバージョン1.2

+0

また、何らかのバージョン管理を実行しようとしています。私はあなたに[この質問](http://stackoverflow.com/questions/16665797/spring-data-version-annotation-not-incrementing-when-used-on-a-mongo-collection)を紹介したいと思います。注釈を使用して自動バージョン管理をセットアップするために、Spring Mongoで再監査を依頼しました。 –

+0

ありがとうございます、私は私のバージョン管理で十分満足しています:-) –

答えて

1

おそらく、カスタム春コンバータのBigInteger =>のObjectIdとのObjectId =>のBigIntegerを書きたいです。

ここではドキュメントの一部を参照してください: http://static.springsource.org/spring-data/data-document/docs/current/reference/html/#d0e2670

を------ ------ UPDATE

コンバータのこの種は、すでに春データ - に存在しているようです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

それは言うよりも簡単です:-)。私はSpringデータのバージョン1.0のドキュメントでこのクラスを見つけました。しかし、私は理由のために春のデータバージョンを述べた - 限り、私は1.2にそのようなコンバータがないと見る。 –

1

また、あなたのコレクションクラスに「ID」フィールドを追加したり、潜在的に基底クラスとorg.springframework.data.annotation.Idでそれに注釈を付け、以下のようにすることができます

import org.springframework.data.annotation.Id; 

public abstract class BaseDocument { 

    @Id 
    protected long id; 

これはあなたをできるようになりますフォームのクエリを実行する:「@Id」を使用して独自のidフィールドの注釈

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

そのため、変換を自分でやってからあなたを節約、モンゴOBJECTIDとして、あなたのIDを格納します。

+1

あなたは何かが間違っています。私は自分のエンティティで@Id BigIntegerフィールドを持っています。そして、Spring Dataは実際にそのBigIntをObjectIdとして保存します。しかし、...問題は保存ではなく、Queryに値を渡すことです。 –

+0

@AleksandrKravets大丈夫です。照会で必要なのは、 '_id'という名前の注釈付きフィールドが指定されているもので置き換えられます。私の例のようにidフィールドの名前が "id"の場合、次のように条件を変更してください:Criteria.where( "id")。(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

あなたはBigIntegerの16進表現を使用してBigIngeterObjectIdに変換することができます。しかし、ObjectIdは正確に24文字の長さであると考えられ、短い文字列の解析はJavaでは失敗します。したがって、16進表現が適切に0パディングされていることを確認することをお勧めします。

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