簡體   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