Skip to content

Commit 374ebb8

Browse files
grwang91mp911de
authored andcommitted
Fix string to objectId mapping error when using query method.
Closes #4490 Original pull request: #4519
1 parent f386e05 commit 374ebb8

File tree

2 files changed

+89
-10
lines changed

2 files changed

+89
-10
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java

+14-10
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
* @author Mark Paluch
8787
* @author David Julia
8888
* @author Divya Srivastava
89+
* @author Gyungrai Wang
8990
*/
9091
public class QueryMapper {
9192

@@ -715,17 +716,20 @@ private Object convertIdField(Field documentField, Object source) {
715716
Document valueDbo = (Document) value;
716717
Document resultDbo = new Document(valueDbo);
717718

718-
if (valueDbo.containsKey("$in") || valueDbo.containsKey("$nin")) {
719-
String inKey = valueDbo.containsKey("$in") ? "$in" : "$nin";
720-
List<Object> ids = new ArrayList<>();
721-
for (Object id : (Iterable<?>) valueDbo.get(inKey)) {
722-
ids.add(convertId(id, getIdTypeForField(documentField)));
719+
for (Entry<String, Object> entry : valueDbo.entrySet()) {
720+
721+
String key = entry.getKey();
722+
if ("$nin".equals(key) || "$in".equals(key)) {
723+
List<Object> ids = new ArrayList<>();
724+
for (Object id : (Iterable<?>) valueDbo.get(key)) {
725+
ids.add(convertId(id, getIdTypeForField(documentField)));
726+
}
727+
resultDbo.put(key, ids);
728+
} else if (isKeyword(key)) {
729+
resultDbo.put(key, convertIdField(documentField, entry.getValue()));
730+
} else {
731+
resultDbo.put(key, getMappedValue(documentField, entry.getValue()));
723732
}
724-
resultDbo.put(inKey, ids);
725-
} else if (valueDbo.containsKey("$ne")) {
726-
resultDbo.put("$ne", convertId(valueDbo.get("$ne"), getIdTypeForField(documentField)));
727-
} else {
728-
return getMappedObject(resultDbo, Optional.empty());
729733
}
730734

731735
return resultDbo;

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java

+75
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
* @author Christoph Strobl
7373
* @author Mark Paluch
7474
* @author David Julia
75+
* @author Gyungrai Wang
7576
*/
7677
public class QueryMapperUnitTests {
7778

@@ -129,6 +130,80 @@ void handlesObjectIdCapableBigIntegerIdsCorrectly() {
129130
assertThat(result).containsEntry("_id", id);
130131
}
131132

133+
@Test // GH-4490
134+
void translates$GtCorrectly() {
135+
136+
Criteria criteria = where("id").gt(new ObjectId().toString());
137+
138+
org.bson.Document query = new org.bson.Document("id", new ObjectId().toString());
139+
org.bson.Document result = mapper.getMappedObject(criteria.getCriteriaObject(),
140+
context.getPersistentEntity(IdWrapper.class));
141+
Object object = result.get("_id");
142+
assertThat(object).isInstanceOf(org.bson.Document.class);
143+
org.bson.Document document = (org.bson.Document) object;
144+
assertThat(document.get("$gt")).isInstanceOf(ObjectId.class);
145+
}
146+
147+
@Test // GH-4490
148+
void translates$GteCorrectly() {
149+
150+
Criteria criteria = where("id").gte(new ObjectId().toString());
151+
152+
org.bson.Document query = new org.bson.Document("id", new ObjectId().toString());
153+
org.bson.Document result = mapper.getMappedObject(criteria.getCriteriaObject(),
154+
context.getPersistentEntity(IdWrapper.class));
155+
Object object = result.get("_id");
156+
assertThat(object).isInstanceOf(org.bson.Document.class);
157+
org.bson.Document document = (org.bson.Document) object;
158+
assertThat(document.get("$gte")).isInstanceOf(ObjectId.class);
159+
}
160+
161+
@Test // GH-4490
162+
void translates$LteCorrectly() {
163+
164+
Criteria criteria = where("id").lte(new ObjectId().toString());
165+
166+
org.bson.Document query = new org.bson.Document("id", new ObjectId().toString());
167+
org.bson.Document result = mapper.getMappedObject(criteria.getCriteriaObject(),
168+
context.getPersistentEntity(IdWrapper.class));
169+
Object object = result.get("_id");
170+
assertThat(object).isInstanceOf(org.bson.Document.class);
171+
org.bson.Document document = (org.bson.Document) object;
172+
assertThat(document.get("$lte")).isInstanceOf(ObjectId.class);
173+
}
174+
175+
@Test // GH-4490
176+
void translates$LtCorrectly() {
177+
178+
Criteria criteria = where("id").lt(new ObjectId().toString());
179+
180+
org.bson.Document query = new org.bson.Document("id", new ObjectId().toString());
181+
org.bson.Document result = mapper.getMappedObject(criteria.getCriteriaObject(),
182+
context.getPersistentEntity(IdWrapper.class));
183+
Object object = result.get("_id");
184+
assertThat(object).isInstanceOf(org.bson.Document.class);
185+
org.bson.Document document = (org.bson.Document) object;
186+
assertThat(document.get("$lt")).isInstanceOf(ObjectId.class);
187+
}
188+
189+
@Test // GH-4490
190+
void translatesMultipleCompareOperatorsCorrectly() {
191+
192+
Criteria criteria = where("id").lt(new ObjectId().toString()).lte(new ObjectId().toString())
193+
.gt(new ObjectId().toString()).gte(new ObjectId().toString());
194+
195+
org.bson.Document query = new org.bson.Document("id", new ObjectId().toString());
196+
org.bson.Document result = mapper.getMappedObject(criteria.getCriteriaObject(),
197+
context.getPersistentEntity(IdWrapper.class));
198+
Object object = result.get("_id");
199+
assertThat(object).isInstanceOf(org.bson.Document.class);
200+
org.bson.Document document = (org.bson.Document) object;
201+
assertThat(document.get("$lt")).isInstanceOf(ObjectId.class);
202+
assertThat(document.get("$lte")).isInstanceOf(ObjectId.class);
203+
assertThat(document.get("$gt")).isInstanceOf(ObjectId.class);
204+
assertThat(document.get("$gte")).isInstanceOf(ObjectId.class);
205+
}
206+
132207
@Test // DATAMONGO-278
133208
void translates$NeCorrectly() {
134209

0 commit comments

Comments
 (0)