[英]Use $or operator in @Query annotation in spring data mongodb repository
[英]How to use projecting types in Spring Data MongoDB repository's query methods?
我一直在使用Spring Data和MongoDB,並且有關於限制某些查詢的數據量的問題。 我已經看到在MongoRepository
添加自定義查詢,但是我沒有看到任何限制數據量和返回基本上是較大類的子集的類的示例。
例如,我有一個包含多個字段的User
類,但我還想創建一個UserShort
類,該類包含User
類中的字段子集。 例如, UserShort
只包含id
和firstName
/ 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.