Próbuję włączyć Spring-Data-JPA do mojego projektu. Jedyną rzeczą, która mnie wprawia w zakłopotanie, jest to, w jaki sposób mogę osiągnąć setMaxResults (n) za pomocą adnotacji?
na przykład mój kod:
public interface UserRepository extends CrudRepository<User , Long>
{
@Query(value="From User u where u.otherObj = ?1 ")
public User findByOhterObj(OtherObj otherObj);
}
Muszę tylko zwrócić one (and only one)
użytkownika z otherObj, ale nie mogę znaleźć sposobu na dodanie adnotacji do maxResults. Czy ktoś może mi podpowiedzieć?
(mysql narzeka:
com.mysql.jdbc.JDBC4PreparedStatement@5add5415: select user0_.id as id100_, user0_.created as created100_ from User user0_ where user0_.id=2 limit ** NOT SPECIFIED **
WARN util.JDBCExceptionReporter - SQL Error: 0, SQLState: 07001
ERROR util.JDBCExceptionReporter - No value specified for parameter 2
)
Znalazłem link: https://jira.springsource.org/browse/DATAJPA-147 , próbowałem, ale nie udało się. Teraz wydaje się to niemożliwe? Dlaczego tak ważna funkcja nie jest wbudowana w Spring-Data?
Jeśli zaimplementuję tę funkcję ręcznie:
public class UserRepositoryImpl implements UserRepository
Muszę zaimplementować mnóstwo predefiniowanych metod CrudRepository
, to byłoby straszne.
środowiska: spring-3.1, spring-data-jpa-1.0.3.RELEASE.jar, spring-data-commons-core-1.1.0.RELEASE.jar
źródło
List
jako zwracanego typu metody.Top
aFirst
słowa kluczowe nie mają zastosowania do metod, które używają@Query
adnotacji? Tylko te, które używają generowania zapytań na podstawie nazwy metody?Jeśli używasz języka Java 8 i Spring Data 1.7.0, możesz użyć metod domyślnych, jeśli chcesz połączyć
@Query
adnotację z ustawieniem maksymalnych wyników:źródło
Stream<User> ... {...} default Optional<User> ... { ...findAny() }
Istnieje sposób na zapewnienie odpowiednika „a setMaxResults (n) przez adnotację”, jak poniżej:
Powinno to załatwić sprawę, gdy jako parametr wysyłany jest stronicowany element. Na przykład, aby pobrać pierwsze 10 rekordów, musisz ustawić stronicowanie na tę wartość:
źródło
List
działa doskonale (i pozwala uniknąć niepotrzebnegocount
zapytania, jak już wspomniano w poprzednim komentarzu )Użyj Spring Data Evans (1.7.0 RELEASE)
nowa wersja Spring Data JPA z kolejną listą modułów o nazwie Evans ma funkcję używania słów kluczowych
Top20
iFirst
ograniczania wyniku zapytania,więc możesz teraz pisać
lub
lub dla pojedynczego wyniku
źródło
Pageable
obiekt. sprawdź dokumentację wiosennąDla mnie najlepszym wyborem jest zapytanie natywne:
źródło
nativeQuery
dodany parametr adnotacji JPA nie do ignorowania.Jeśli Twoja klasa się
@Repository
rozszerzaJpaRepository
, możesz skorzystać z poniższego przykładu.getContent zwraca plik
List<Transaction>
.źródło
Jest to również możliwe przy użyciu @QueryHints. Poniższy przykład używa org.eclipse.persistence.config.QueryHints # JDBC_MAX_ROWS
źródło
@QueryHints({@QueryHint(name = org.hibernate.annotations.FETCH_SIZE, value = "1")})
w Hibernate, ale alias :( nie działanew PageRequest(0,10)
nie działa w nowszych wersjach Springa (używam2.2.1.RELEASE
). Zasadniczo konstruktor otrzymał dodatkowy parametr jakoSort
typ. Ponadto konstruktor jestprotected
taki, że musisz albo użyć jednej z jego klas potomnych, albo wywołaćof
metodę statyczną:Możesz również pominąć użycie
Sort
parametru i niejawnie użyć domyślnego sortowania (sortowanie według pk itp.):Twoja deklaracja funkcji powinna wyglądać mniej więcej tak:
a funkcja będzie:
źródło