Spring Data MongoDB因" in"而失败询问

时间:2015-10-22 07:49:21

标签: spring mongodb spring-data-mongodb

我使用的是spring-data-mongodb 1.8.0; MongoDB 3.0.6; mongo-java-driver 3.1.0; spring-framework.version 4.0.3。

我想要的是查询具有特定电话号码的user列表。 用户示例:{ "_id" : ObjectId("5625e5c32e1ca013a03f0d1b"), "phone" : "12345535"}

在Mongo Shell中db.user.find({phone: { $in: [ "12345535", "123535"]}})运行正常。但在春天我失败了。 Java类用户(省略了getter / setter):

@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)

但是将字段电话更改为 id ,相同的代码可以正常工作。

Query q = new Query(Criteria.where("id").in("5625e5c32e1ca013a03f0d1b","f0d1e"));
mongoTemplate.find(q, User.class);

通过调试,我发现它甚至没有进入请求阶段,查询构建阶段发生错误。似乎$in无法处理PropertyPath.create,而在id情况下, for (int i = 0; i < 4; i++) { //start task with current connection tasks[i] = Task<byte[]>.Run(() => GetData(i, plcPool[i])); } 可以处理 tasks[0] = Task<byte[]>.Run(() => GetData(0, plcPool[0])); tasks[1] = Task<byte[]>.Run(() => GetData(1, plcPool[1])); tasks[2] = Task<byte[]>.Run(() => GetData(2, plcPool[2])); tasks[3] = Task<byte[]>.Run(() => GetData(3, plcPool[3]));

我该如何解决这个问题?我是一个新手,搜索了很多但没有运气。可以帮助我。每个答案都表示赞赏。谢谢你们。

2 个答案:

答案 0 :(得分:11)

announcement blogrelease train wiki所示,Spring Data MongoDB 1.8需要Spring 4.1,理想情况下4.1.8,其中包含一个重要的安全修复程序。

答案 1 :(得分:0)

使用Spring 4.2.3.RELEASE和Spring MongoDB 1.6.1时出现了这个问题

切换到Spring mongoDB 1.8.1解决了这个问题。

(作为对@ OliverGierke的答案的评论,但由于声誉水平低而无法做到。)