Property wyrażenia
wyrażenia nieruchomość może odnosić się tylko do bezpośredniego majątku zarządzanego podmiotu, jak pokazano w poprzednim przykładzie. W momencie tworzenia zapytania upewniłeś się, że parsowana właściwość jest własnością zarządzanej klasy domeny. Można jednak również definiować wiązania, przechodząc przez zagnieżdżone właściwości. Załóżmy, że osoby mają adresy z kodami Zip. W takim przypadku nazwa metody:
List findByAddressZipCode (Kod pocztowy ZipCode); tworzy właściwość traversal x.address.zipCode. Algorytm rozdzielczości rozpoczyna się od interpretacji całej części (AddressZipCode) jako właściwości i sprawdza klasę domeny dla właściwości o tej nazwie (bezapisu). Jeśli algorytm się powiedzie, użyje tej właściwości. Jeśli nie, algorytm dzieli źródło na części wielbłąda z prawej strony na głowę i ogon i próbuje znaleźć odpowiednią właściwość, w naszym przykładzie, adresZip i kod. Jeśli algorytm znajdzie właściwość z tą głową, bierze ogon i dalej buduje drzewo stamtąd, dzieląc ogon w opisany sposób. Jeśli pierwszy podział się nie zgadza, algorytm przesuwa punkt podziału w lewo (adres, kod pocztowy) i kontynuuje.
Mimo że powinno to działać w większości przypadków, algorytm może wybrać niewłaściwą właściwość. Załóżmy, że klasa Person ma również właściwość addressZip. Algorytm byłby zgodny już w pierwszej rundzie podziału i zasadniczo wybiera niewłaściwą właściwość i ostatecznie kończy się niepowodzeniem (ponieważ typ adresuZip prawdopodobnie nie ma właściwości code). Aby rozwiązać tę niejednoznaczność, możesz użyć _ wewnątrz nazwy metody, aby ręcznie zdefiniować punkty przejścia.Więc nasza nazwa metody skończy się tak:
UserDataRepository:
Lista findByAddress_ZipCode (KodPocztowy kod pocztowy);
UserData findByUserId (String userId);
ProfileRepository:
profilu findByProfileId (String ProfileID);
UserDataRepositoryImpl:
UserData userData = userDateRepository.findByUserId (userId);
Profil profilu = profileRepository.findByProfileId (userData.getProfileId());
userData.setProfile (profil);
Próbka Pojo:
public class UserData {
private String userId;
private String status;
private Address address;
private String profileId;
//New Property
private Profile profile;
//TODO:setter & getter
}
public class profilu {
private String email;
private String profileId;
}
Dla powyższego dokumentu/POJO w klasie repozytorium:
UserData findByProfile_Email (String email);
Dla Ref: http://docs.spring.io/spring-data/data-commons/docs/1.6.1.RELEASE/reference/html/repositories.html
Dzięki za odpowiedz, ale znowu ta kwerenda zwraca array, a nie odpowiedni element w tablicy. – user1720083
Oh. Rozumiem, co masz na myśli. Możesz tylko zwrócić cały dokument. Zapytanie faktycznie szuka dokumentów, które mają ten questionID. Ale zawsze dostajesz cały dokument - nigdy nie tylko pytanie. To nie jest java, to sprawa MongoDB.Popatrz na to pytanie/odpowiedź w celu wyjaśnienia: http://stackoverflow.com/a/3985982/229178 – sbzoom
Po kilku zadaniach domowych zdałem sobie sprawę, że możesz określić częściowe obiekty w części "pola" zapytania ("projekcje"). http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+ofields Zaktualizuję powyższą odpowiedź, aby podać przykład. – sbzoom