在Spring中使用接口查询MongoDB+;JAVA

在Spring中使用接口查询MongoDB+;JAVA,java,spring,mongodb,Java,Spring,Mongodb,我在Mongo中有一个用户集合: { "_id" : "user1", "_class" : "edu.asu.spring.herckules.domain.impl.User", "password" : "99fd6396-a9a3-4c7d-8c1e-f834d99bdc9e", } { "_id" : "user2", "_class" : "edu.asu.spring.herckules.domain.

我在Mongo中有一个用户集合:

{
        "_id" : "user1",
        "_class" : "edu.asu.spring.herckules.domain.impl.User",
        "password" : "99fd6396-a9a3-4c7d-8c1e-f834d99bdc9e",
}
{
        "_id" : "user2",
        "_class" : "edu.asu.spring.herckules.domain.impl.User",
        "password" : "075d743d-32ee-4193-bb6f-0e827bebc34e",
}
只包含getter和setter的相应java类和接口:

public class User implements IUser{

@Id
private String username;
private String password;

@Override
    public String getUsername() {
        return username;
    }

@Override
public void setUsername(String username) {
    this.username = username;
}

@Override
public String getPassword() {
    return password;
}

@Override
public void setPassword(String password) {
    this.password = password;
}
}

@Document(collection = "user")
public interface IUser {

public abstract void setUsername(String username);

public abstract String getPassword();

public abstract void setPassword(String password);

public abstract String getUsername();

}
例如,现在让我们假设我正在尝试根据用户ID列表查找用户对象列表

@Autowired
private MongoTemplate mongoTemplate;

//Inside method
List<String> useridList = new ArrayList<String>();
useridList.add("user1");
useridList.add("user2");
Query query = Query.query(Criteria.where("username").in(useridList));
List<IUser> usersList = mongoTemplate.find(query, IUser.class); 
@Autowired
私有MongoTemplate MongoTemplate;
//内法
List useridList=new ArrayList();
useridList.add(“user1”);
useridList.add(“user2”);
Query Query=Query.Query(在(useridList)中的Criteria.where(“username”));
List usersList=mongoTemplate.find(查询,IUser.class);
我得到以下例外情况:

java.lang.IllegalArgumentException: No property username found on edu.asu.spring.herckules.domain.IUser!
    at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentPropertyPath(AbstractMappingContext.java:199)
    at org.springframework.data.mongodb.core.convert.QueryMapper$MetadataBackedField.getPath(QueryMapper.java:560)
    at org.springframework.data.mongodb.core.convert.QueryMapper$MetadataBackedField.<init>(QueryMapper.java:486)
    at org.springframework.data.mongodb.core.convert.QueryMapper.getMappedObject(QueryMapper.java:104)
    at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1489)
    at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1480)
    at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:527)
    at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:518)
java.lang.IllegalArgumentException:在edu.asu.spring.herckules.domain.IUser上找不到属性用户名!
位于org.springframework.data.mapping.context.AbstractMappingContext.getPersistentPropertyPath(AbstractMappingContext.java:199)
位于org.springframework.data.mongodb.core.convert.QueryMapper$MetadataBackedField.getPath(QueryMapper.java:560)
位于org.springframework.data.mongodb.core.convert.QueryMapper$MetadataBackedField。(QueryMapper.java:486)
位于org.springframework.data.mongodb.core.convert.QueryMapper.getMappedObject(QueryMapper.java:104)
位于org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1489)
位于org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1480)
位于org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:527)
位于org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:518)
我尝试按照建议使用@TypeAlias,但这并没有解决我的问题。我无法在find查询中使用接口吗


谢谢大家。

您应该在POJO类中声明您的
@文档(collection=“user”)
,POJO类是您的用户类,而不是在您的界面中

来自Spring数据Mongo参考的代码

  package com.mycompany.domain;

@Document
public class User{

  @Id
  private String username;
  private String password;

... getter/setters
}
然后您可以使用Spring数据存储库

public interface UserRepository extends Repository<User, String> {

      User findByUsernameAndPassword(String username, String password);

}
要添加更多,您可以创建一个接口并使用自定义实现。 比如说

@Repository
public interface UserRepositoryCustome {
public void setUsername(String username);
}
您的实现

public class UserRepositoryImpl implements UserRepositoryCustome {
    @Autowired
    MongoTemplate mongoTemplate;
    public void setUsername(String username){
   //code to set the user name
  } 
}

现在,您可以通过
@Autowired UserRepository userRepo访问
setUsername

为了让您知道……默认情况下,接口中的方法是抽象的,您不必为接口中的每个方法指定抽象。我认为您@Document(collection=“user”)应该在POJO类中声明,POJO类是您的用户类,而不是在接口中声明它。您必须更改find方法中的代码以映射到User.classI。我知道在User类上使用文档注释是有效的。我的问题是,有没有一种方法可以让我使用带有文档注释的接口,也可以在find方法中使用相同的接口?如果我理解正确,您的接口将有方法,您的POJO将有字段,这些字段将映射到mongo文档中的字段。当您使用Find进行查询时,您正在将数据从Mongo文档映射到POJO类……我不明白为什么或者如何将数据映射到接口中的方法?
public class UserRepositoryImpl implements UserRepositoryCustome {
    @Autowired
    MongoTemplate mongoTemplate;
    public void setUsername(String username){
   //code to set the user name
  } 
}