【问题标题】:Use an interface to query MongoDB in Spring + JavaSpring + Java中使用接口查询MongoDB
【发布时间】:2014-01-31 00:46:22
【问题描述】:

我在 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); 

我收到以下异常:

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)

我尝试按照here 的建议使用@TypeAlias,但这并没有解决我的问题。有没有办法在查找查询中使用接口?

谢谢大家。

【问题讨论】:

  • 只是让您知道...您的接口中的方法默认为抽象,并且您没有为接口中的每个方法指定抽象。
  • 我认为你 @Document(collection = "user") 应该在 POJO 类中声明,这是你的用户类,而不是在你的界面中。而且您必须更改 find 方法中的代码以映射到 User.class
  • 我知道在 User 类上使用 Document 注释是可行的。我的问题是,有没有一种方法可以使用带有 Document 注释的接口并在 find 方法中使用相同的接口?
  • 如果我理解正确,您的界面将有方法,您的 POJO 将有字段,这些字段将映射到您的 mongo 文档中的字段。当您使用 Find 进行查询时,您正在将数据从 Mongo 文档映射到您的 POJO 类...我对您为什么或如何将数据映射到接口中的方法感到困惑?

标签: java spring mongodb


【解决方案1】:

您应该在作为您的用户类的 POJO 类中声明您的 @Document(collection="user"),而不是在您的界面中。

Link to Spring Data MongoDB

来自 Spring Data Mongo 参考的代码。

  package com.mycompany.domain;

@Document
public class User{

  @Id
  private String username;
  private String password;

... getter/setters
}

然后你可以使用 Spring Data Repository

public interface UserRepository extends Repository<User, String> {

      User findByUsernameAndPassword(String username, String password);

}

这就是你所要做的。现在,您可以将 UserRepository 注入您想要查找 User 记录的任何类中

例如,如果您有一个像下面这样的类并且想知道用户是否存在于数据库中

@Component
public class AnyClass{
@Autowired
UserRepository userRepo;

public boolean findUser(String userName, String password){
boolean flag="false";
User user=userRepo.findByUsernameAndPassword(userName,password);
if(user!=null){
   flag='true';
}
return flag;

}

}

要添加更多内容,您可以创建一个接口并进行自定义实现。 例如

@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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多