如何在Spring Data MongoDB存储库查询方法中使用投影类型?

时间:2014-08-19 21:15:22

标签: java spring mongodb spring-data-mongodb

我一直在使用Spring Data和MongoDB,并且有一个关于限制某些查询的数据量的问题。我已经看到在MongoRepository中添加自定义查询,但是我还没有看到任何限制数据量和返回基本上是较大类的子集的类的示例。

例如,我有一个User类,其中包含多个字段,但我还想创建一个UserShort类,其中包含User类中字段的子集。例如,UserShort只会包含idfirstName / 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
}

存储库界面:

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

}

1 个答案:

答案 0 :(得分:4)

只要查询方法的返回类型可分配给托管域类型(在您的情况下为Users),我们将更喜欢返回类型来确定要运行查询的集合。因此,在您的情况下,我们会针对userShort而不是users执行查询,这就是您没有获得任何结果的原因。该行为适用于支持将继承层次结构存储到不同的集合中。

如果您切换到User作为存储库的域类型,那么事情应该完全按预期工作。这样做的好处还在于可以防止客户将UserShort个实例移交给save(…)方法,这会清除User中包含但UserShort中不包含的属性。这是最终的存储库接口声明。

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中提供。