繁体   English   中英

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

[英]How to use projecting types in Spring Data MongoDB repository's query methods?

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

例如,我有一个包含多个字段的User类,但我还想创建一个UserShort类,该类包含User类中的字段子集。 例如, UserShort只包含idfirstName / lastName / email字段,而不是所有内容。

我已经看到我可以指定/限制返回的字段,但是我可以让那些返回到不同的类吗? 除非我指定User类,否则UserShort将返回null ,但字段将限制为我指定的字段。 不确定这是否可行? 我意识到下面的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);

}

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

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

interface UserRepository extends MongoRepository<User, String> {

    User findByEmail(String email);

    @Query(value="{ 'email' : ?0 }", fields="{ 'firstName' : 1, 'lastName' : 1}")
    UserShort findUserShortByEmail(String email);
}

PS:在评论中概述了@ byte-crunch,它目前仅适用于投影集合,但不适用于返回单个实例。 这已在DATAMONGO-1030中报告并修复, 并将在1.5.4和1.6.0 GA中提供。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM