2015-05-22 17 views
10

Czy dane sprężyn mają mechanizm zwracania określonych pól?Dane źródłowe JPA dotyczące zwracania określonych pól

jestem zaznajomiony ze składnią:

Invoice findByCode(String code); 

Jak o tym:

Integer findIdByCode(String code); 

która zwraca tylko pola id. Lub

Tuple findIdAndNameByCode(String code); 

która zwraca krotkę. Lub

Invoice findIdAndNameByCode(String code); 

który zwraca jednostkę wypełnioną tylko z określonymi polami. Potrafi użyć konstruktora pobierającego tylko te pola, jeśli jest zdefiniowane - w innym przypadku konstruuj puste i wypełnij pola.

EDIT

Aby zakwalifikować się trochę więcej, jestem świadomy rozwiązań takich jak @query, wyrażeń konstruktorów i teraz, @NamedEntityGraph. Moje pytanie jest po prostu - czy dane z Springa wspierają tak skróconą składnię, jak sugeruję?

Jeśli nie, być może to jest cool wzmocnienie dla nowszej wersji ...

ja nie szukam rozwiązania.

+0

Patrz [przewodnik] (http: //docs.spring .io/spring-data/jpa/docs/1.8.0.RELEASE/reference/html/# jpa.entity-graph) wymaga wersji 2.1 i nowszych • Wersja Spring Data JPA. –

+0

NamedEntityGraph to użyteczna funkcja, ale bardziej szczegółowa niż przy użyciu @Query do rozwiązywania moich scenariuszy. Chciałbym zobaczyć rozwiązanie bez żadnych adnotacji. – Gilbert

+0

W jaki sposób '@ Query' nie jest adnotacją .. Zamiast więc używać domyślnego rozwiązania, które chcesz obejść. Tak czy inaczej, musisz coś zrobić, aby zwrócić podzbiór danych, który chcesz, używając domyślnego, który jest wielokrotnego użytku podczas wykonywania zapytania, musisz za każdym razem powtarzać wszystko i tworzyć wiele różnych konstruktorów. –

Odpowiedz

3

Można użyć JPQL Constructor Expressions:

SELECT NEW com.company.PublisherInfo(pub.id, pub.revenue, mag.price) 
    FROM Publisher pub JOIN pub.magazines mag WHERE mag.price > 5.00 

Nazwa konstruktor musi być w pełni wykwalifikowany

+0

Zobacz mój numer edytuj – Gilbert

+0

Sprawdź także teraz projekcje, niezupełnie, co chcesz, ale bliżej - http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections – chrismarx

1

Jeśli chcesz zwrócić tylko 1 pole z tabeli i to prymitywny (lub autoboxing), można użyć obok:

@Query("select distinct t.locationId from Table t") 
List<Long> findAllWashroomLocationId(); 

Gdzie:

  • Tabela - nazwa klasy, które przedstawiają tabela
  • t - alias
  • locationId - nazwa pola (w swoim obiekcie tabela)
  • Długi - rodzaj locationId (Integer, String, ...)
1

Nie jesteś pewien, czy to, co próbujesz osiągnąć, jest tym samym, co użycie wielu prognoz w tej samej kwerendzie generowanej przez JPA (gdzie nazwa metody ar to samo). Odpowiedziałem w tym poście.

https://stackoverflow.com/a/43373337/4540216

Więc udało mi się dowiedzieć się, jak korzystać z wielu występów z pojedynczego zapytania.

<T> T getByUsername(String username, Class<T> projection) This allows the method caller to specified the type of projection to be 

zastosowane do zapytania.

Aby jeszcze bardziej poprawić to, aby był mniej podatny na błędy, stworzyłem pusty interfejs , który będzie musiał zostać przedłużony, aby umożliwić wstawić klasę do parametru.

public interface JPAProjection { 
} 

public interface UserRepository extends CrudRepository<UserAccount, Long> { 
    <T extends JPAProjection > T getByUsername(String username, Class<? extends JPAProjection> projection); 
} 

Interfejs projekcja

public interface UserDetailsProjection extends JPAProjection{ 
    @Value("#{target.username}") 
    String getUsername(); 

    @Value("#{target.firstname}") 
    String getFirstname(); 

    @Value("#{target.lastname}") 
    String getLastname(); 
} 

Następnie można wywołać w sposób zapytań,

getByUsername("...", UserDetailsProjection.class)