Spring Data Mongo Custom Repository Query with ObjectID
As the accepted solution did not yield any results in my case, I had to find another solution, that was:
Instead of using the autogenerated query functionality defined via @Query(...)
I opted for manually building the DBObject
used to query mongo, and defining the functionality as a default
implementation in the interface, thus keeping it "clean"
("
- because had to introduce a _query
method)
Note: This solution only works in Java 1.8+
public interface SomeRepository extends MongoRepository<SomeEntity, String> {
@Query("{'nestedEntity._id': ?0}")
SomeEntity findByNestedEntityId_DoesntWork(String nestedEntityId);
@Query("?0")
SomeEntity _query(DBObject query);
default SomeEntity findByNestedEntityId(String nestedEntityId) {
DBObject queryObject = BasicDBObjectBuilder
.start("nestedEntity._id", new ObjectId(nestedEntityId))
.get();
return this._query(queryObject);
}
}
Try this
@Query("{ 'items': { $elemMatch: { 'refund.id' : ?0 } } }")
RMA findRMAByItemRefund(String refundId);
From my experience, ?0
should standalone and not used as a mongo function parameter.
Also, is $id
your own assumption or the field is actually stored as $id
. If not, I will go with refund.id
I guess my problem was a little different, but since I couldn't find answer anywhere, I believe it's worth mentioning. Basically I wanted to do the search by ObjectId AND userId, so here's what I've done:
@Query("{ '_id': ?0, 'userId': ?1 }")
T findByObjectIdAndUserId(final ObjectId objectId, final Long userId);