我一直在玩 Spring Data 和 MongoDB,并且有一个关于限制某些查询的数据量的问题。我已经看到在 MongoRepository
中添加自定义查询,但是我没有看到任何限制数据量和返回基本上是较大类子集的类的示例。
例如,我有一个具有多个字段的 User
类,但我还想创建一个 UserShort
类,该类具有 中的字段子集用户
类。例如 UserShort
将只包含 id
和 firstName
/lastName
/email
字段,而不是一切。
我已经看到我可以指定/限制返回的字段,但我可以将它们返回到不同的类中吗?目前 UserShort
将返回 null
除非我指定 User
类,但字段将限于我指定的字段。不确定这是否可能?我意识到下面的 User
类并不大,但这是我所追求的概念。
用户界面:
public interface Users {}
子集类:
public class UserShort implements Users {
@Id
private String id;
private String firstName;
private String lastName;
@Indexed(unique = true)
private String email;
//getters / setters
}
全类:
@Document
public class User implements Users {
@Id
private String id;
private String firstName;
private String lastName;
private String username;
private String password;
private Date dob;
private Status status;
@Indexed(unique = true)
private String email;
private Gender gender;
private String locale;
private Date registerDate;
@DBRef
private List<UserAddress> addresses;
public User(){
addresses = new ArrayList<UserAddress>();
}
//getters / setters
}
还有仓库接口(interface):
public interface UserRepository extends MongoRepository<Users, String> {
public User findByEmail(String email);
@Query(value="{ 'email' : ?0 }", fields="{ 'firstName' : 1, 'lastName' : 1}")
public UserShort findUserShortByEmail(String email);
}
最佳答案
只要查询方法的返回类型可分配给托管域类型(在您的情况下为 Users
),我们将更喜欢返回类型来确定运行查询的集合。因此,在您的情况下,我们将针对 userShort
而不是 users
执行查询,这就是您没有得到任何结果的原因。这种行为是为了支持将继承层次结构存储到不同的集合中。
如果您切换到 User
作为存储库的域类型,事情应该完全按预期工作。这也有利于防止客户端将 UserShort
实例交给 save(…)
方法,该方法将清除 User
中包含的属性,但是不在 UserShort
中。这是最终的存储库接口(interface)声明。
interface UserRepository extends MongoRepository<User, String> {
User findByEmail(String email);
@Query(value="{ 'email' : ?0 }", fields="{ 'firstName' : 1, 'lastName' : 1}")
UserShort findUserShortByEmail(String email);
}
P.S.:@byte-crunch 在评论中概述了这目前仅适用于投影集合,但不适用于返回单个实例。这已在 DATAMONGO-1030 中报告并修复并将在 1.5.4 和 1.6.0 GA 中提供。
关于java - 如何在 Spring Data MongoDB 存储库查询方法中使用投影类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25393096/