2013-07-08 31 views
5

Tôi gặp sự cố với truy vấn cập nhật bằng cách sử dụng dữ liệu Spring MongoDB. Tôi lấy một số của đối tượng _id như giá trị BigInteger. Sau đó, tôi muốn thực hiện sau đây truy vấn:Dữ liệu mùa xuân MongoDB: BigInteger để chuyển đổi đối tượng

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

Query phần không phù hợp với bất kỳ tài liệu vì giá trị id truyền cho is() bằng cách nào đó phải được chuyển đổi sang ObjectId. Tôi không thể tìm thấy bất kỳ tài liệu nào về loại chuyển đổi này. Sẽ đánh giá cao sự giúp đỡ nào.

P.S .: SpringData MongoDB phiên bản 1.2

+0

Tôi cũng thấy rằng bạn đang cố thực hiện một số loại phiên bản. Tôi muốn giới thiệu bạn tho [câu hỏi này] (http://stackoverflow.com/questions/16665797/spring-data-version-annotation-not-incrementing-when-used-on-a-mongo-collection) mà tôi yêu cầu kiểm toán lại với spring mongo, vì nó cũng để thiết lập phiên bản tự động bằng cách sử dụng chú thích. –

+0

Cảm ơn, nhưng tôi đủ hạnh phúc với phiên bản của tôi :-) –

Trả lời

1

Có thể bạn muốn viết một bộ chuyển đổi mùa xuân tùy chỉnh BigInteger => ObjectId và ObjectId => BigInteger.

Xem phần doc ở đây: http://static.springsource.org/spring-data/data-document/docs/current/reference/html/#d0e2670

------ CẬP NHẬT ------

Dường như loại chuyển đổi đã tồn tại trong mùa xuân-đĩa dữ liệu Thư viện MongoDB: http://static.springsource.org/spring-data/data-document/docs/1.0.0.M1/api/org/springframework/data/document/mongodb/SimpleMongoConverter.ObjectIdToBigIntegerConverter.html

Vì vậy, bạn chỉ cần chỉ định nó trong cấu hình Spring.

+0

Thật dễ dàng để nói hơn là làm :-). Tôi đã tìm thấy lớp này trong tài liệu cho phiên bản 1.0 của Spring Data. Nhưng, tôi đã đề cập đến phiên bản dữ liệu Spring vì một lý do - theo như tôi thấy không có trình chuyển đổi nào trong 1.2. –

1

Hoặc bạn có thể thêm một lĩnh vực 'id' đến các lớp học sưu tập của bạn hoặc có khả năng một lớp cơ sở và chú thích nó với org.springframework.data.annotation.Id, như sau:

import org.springframework.data.annotation.Id; 

public abstract class BaseDocument { 

    @Id 
    protected long id; 

này sẽ cho phép bạn để thực hiện các truy vấn có dạng:

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

chú thích trường id của riêng bạn với '@ id' sẽ lưu trữ id của bạn như là Mongo ObjectId, do đó tiết kiệm bạn làm việc chuyển đổi chính mình.

+1

Bạn đang nhận được một cái gì đó sai trái. Tôi có một @Id trên trường BigInteger trong thực thể của tôi. Và Spring Data thực sự tiết kiệm được BigInt như ObjectId. Nhưng ... Vấn đề không phải là tiết kiệm, nhưng trong đi qua giá trị để truy vấn. –

+0

@AleksandrKravets Ok, sau đó tất cả những gì bạn cần làm trong truy vấn của mình là thay thế '_id' bằng bất kỳ id được chú giải trường nào của bạn được đặt tên: tức lànếu trường id của bạn được đặt tên là "id" như trong ví dụ của tôi thì chỉ cần thay đổi tiêu chí của bạn như sau: Criteria.where ("id"). là (id) –

+0

Không, không hoạt động. Như tôi đã đề cập trong câu hỏi, vấn đề không nằm trong tên của trường. Đó là loại giá trị và thiếu chuyển đổi tự động. –

6

Bạn có thể chuyển đổi nó cũng bằng tay:

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

Bạn có thể chuyển đổi một BigIngeter-ObjectId sử dụng các đại diện hex của BigInteger. Tuy nhiên, một ObjectId được cho là dài chính xác 24 ký tự và việc phân tích chuỗi ngắn hơn sẽ không thành công trong Java. Do đó, tốt hơn là đảm bảo rằng biểu diễn hex được đệm 0 một cách thích hợp:

String hexString24 = StringUtils.leftPad(bigInteger.toString(16), 24, "0"); 
ObjectId convertedId = new ObjectId(hexString24); 
Query query = new Query(Criteria.where("_id").is(convertedId)); 
Các vấn đề liên quan