Spring 数据 MongoDB 因 "in" 查询而失败
Spring Data MongoDB failed with "in" query
我正在使用 spring-data-mongodb 1.8.0; Mongo数据库 3.0.6; mongo-java-驱动程序 3.1.0;spring-framework.version 4.0.3.
我想要的是查询 user
的列表,其中包含某些 phone 个数字。
用户示例:{ "_id" : ObjectId("5625e5c32e1ca013a03f0d1b"), "phone" : "12345535"}
在 Mongo Shell db.user.find({phone: { $in: [ "12345535", "123535"]}})
中工作正常。但是在 Spring 我失败了。 Java Class 用户(省略 getters/setters):
@Document(collection = "user")
public class User {
@Id
String id;
String phone;
}
我试过的是:
Query q = new Query(Criteria.where("phone").in("12345535","123535"));
mongoTemplate.find(q, User.class);
出现错误:
Exception in thread "main" java.lang.IllegalAccessError: tried to access class org.springframework.beans.PropertyMatches from class org.springframework.data.mapping.PropertyReferenceException
at org.springframework.data.mapping.PropertyReferenceException.detectPotentialMatches(PropertyReferenceException.java:134)
at org.springframework.data.mapping.PropertyReferenceException.<init>(PropertyReferenceException.java:59)
at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:75)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:327)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:307)
at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:270)
at org.springframework.data.mongodb.core.convert.QueryMapper$MetadataBackedField.getPath(QueryMapper.java:837)
at org.springframework.data.mongodb.core.convert.QueryMapper$MetadataBackedField.<init>(QueryMapper.java:729)
at org.springframework.data.mongodb.core.convert.QueryMapper$MetadataBackedField.with(QueryMapper.java:740)
at org.springframework.data.mongodb.core.convert.QueryMapper$MetadataBackedField.with(QueryMapper.java:686)
at org.springframework.data.mongodb.core.convert.QueryMapper.getMappedKeyword(QueryMapper.java:258)
at org.springframework.data.mongodb.core.convert.QueryMapper.getMappedObjectForField(QueryMapper.java:200)
at org.springframework.data.mongodb.core.convert.QueryMapper.getMappedObject(QueryMapper.java:123)
at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1700)
at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1690)
at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:602)
at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:593)
at com.example.TestMongo.main(TestMongo.java:30)
但是将字段 phone 更改为 id,相同的代码可以正常工作。
Query q = new Query(Criteria.where("id").in("5625e5c32e1ca013a03f0d1b","f0d1e"));
mongoTemplate.find(q, User.class);
调试发现连request阶段都没有,错误发生在query-building阶段。好像$in
不能被PropertyPath.create
处理,而在id
的情况下,它可以。
我该如何解决这个问题?我是新手,搜索了很多但没有找到 luck.Can 请您帮帮我。每一个答案表示赞赏。谢谢大家。
如 announcement blog and the release train wiki 中所述,Spring 数据 MongoDB 1.8 需要 Spring 4.1,最好是 4.1.8,其中包含一个重要的安全修复程序。
我在使用 Spring 4.2.3.RELEASE 和 Spring MongoDB 1.6.1
时出现了这个问题
切换到 Spring mongoDB 1.8.1 解决了问题。
(作为对@OliverGierke 的回答的评论,但由于声誉水平低而无法做到。)
我正在使用 spring-data-mongodb 1.8.0; Mongo数据库 3.0.6; mongo-java-驱动程序 3.1.0;spring-framework.version 4.0.3.
我想要的是查询 user
的列表,其中包含某些 phone 个数字。
用户示例:{ "_id" : ObjectId("5625e5c32e1ca013a03f0d1b"), "phone" : "12345535"}
在 Mongo Shell db.user.find({phone: { $in: [ "12345535", "123535"]}})
中工作正常。但是在 Spring 我失败了。 Java Class 用户(省略 getters/setters):
@Document(collection = "user")
public class User {
@Id
String id;
String phone;
}
我试过的是:
Query q = new Query(Criteria.where("phone").in("12345535","123535"));
mongoTemplate.find(q, User.class);
出现错误:
Exception in thread "main" java.lang.IllegalAccessError: tried to access class org.springframework.beans.PropertyMatches from class org.springframework.data.mapping.PropertyReferenceException
at org.springframework.data.mapping.PropertyReferenceException.detectPotentialMatches(PropertyReferenceException.java:134)
at org.springframework.data.mapping.PropertyReferenceException.<init>(PropertyReferenceException.java:59)
at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:75)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:327)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:307)
at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:270)
at org.springframework.data.mongodb.core.convert.QueryMapper$MetadataBackedField.getPath(QueryMapper.java:837)
at org.springframework.data.mongodb.core.convert.QueryMapper$MetadataBackedField.<init>(QueryMapper.java:729)
at org.springframework.data.mongodb.core.convert.QueryMapper$MetadataBackedField.with(QueryMapper.java:740)
at org.springframework.data.mongodb.core.convert.QueryMapper$MetadataBackedField.with(QueryMapper.java:686)
at org.springframework.data.mongodb.core.convert.QueryMapper.getMappedKeyword(QueryMapper.java:258)
at org.springframework.data.mongodb.core.convert.QueryMapper.getMappedObjectForField(QueryMapper.java:200)
at org.springframework.data.mongodb.core.convert.QueryMapper.getMappedObject(QueryMapper.java:123)
at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1700)
at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1690)
at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:602)
at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:593)
at com.example.TestMongo.main(TestMongo.java:30)
但是将字段 phone 更改为 id,相同的代码可以正常工作。
Query q = new Query(Criteria.where("id").in("5625e5c32e1ca013a03f0d1b","f0d1e"));
mongoTemplate.find(q, User.class);
调试发现连request阶段都没有,错误发生在query-building阶段。好像$in
不能被PropertyPath.create
处理,而在id
的情况下,它可以。
我该如何解决这个问题?我是新手,搜索了很多但没有找到 luck.Can 请您帮帮我。每一个答案表示赞赏。谢谢大家。
如 announcement blog and the release train wiki 中所述,Spring 数据 MongoDB 1.8 需要 Spring 4.1,最好是 4.1.8,其中包含一个重要的安全修复程序。
我在使用 Spring 4.2.3.RELEASE 和 Spring MongoDB 1.6.1
时出现了这个问题切换到 Spring mongoDB 1.8.1 解决了问题。
(作为对@OliverGierke 的回答的评论,但由于声誉水平低而无法做到。)