2012-02-24 16 views
11

Mam interfejs repozytorium z kilkoma abstrakcyjnymi metodami, w których używam adnotacji @Query. Teraz chciałbym dodać obsługę limitów i offsetów dla tych zapytań.Adnotacja zapytania JPQL z ograniczeniem i przesunięciem

przykład:

public interface ProductRepository 
    extends CrudRepository<Product, Long> { 

    @Query("from Product") 
    List<Product> findAllProducts(); 
} 

coś takiego byłoby miło

public interface ProductRepository 
    extends CrudRepository<Product, Long> { 

    @Query("from Product limit :limit ") 
    List<Product> findAllProducts(@Param("limit") Integer limit); 
} 

Ale to nie działa. Jest rozwiązanie, które tworzę implementację interfejsu (http://stackoverflow.com/questions/3479128/jpql-limit-number-of-results) Ale zastanawiam się, czy nie ma możliwości dodania przesunięcia i limitu do zapytania lub jeśli istnieje adnotacja do tego.

+0

Dlaczego po prostu nie zaimplementujesz tej metody i nie użyjesz interfejsu API JPA? Adnotacje są fajne, ale nie powinny zastępować całego kodu Java. –

+1

Jest to standardowy sposób używania i rozszerzania interfejsów repozytorium Spring. –

+2

Pisanie tego ... standardowym sposobem rozwiązania podstawowego problemu jest użycie 'PagingAndSortingRepository'. –

Odpowiedz

5

limit nie jest obsługiwany przez JPQL. Nawet bez niego twoje zapytania są nieważne JPQL queries (ale mogą być poprawne HQL - i mogą działać, jeśli twój dostawca JPA jest tolerancyjny).

Potrzebna jest implementacja (częściowa), aby można było korzystać z interfejsu Query lub interfejsu API kryteriów.

9

+1 do tego, co użytkownik „jego”, powiedział w komentarzu:

„średnia sposobem rozwiązania podstawowego problemu jest użycie PagingAndSortingRepository”

Oto przykład. Rzucam w sortowaniu tylko jako dodatkowy bonus:

public interface ArtifactRepo extends JpaRepository<Artifact, Long> { 
    Page<Artifact> findByComponentKey(String componentKey, Pageable pageable); 
} 

(Można wykorzystać @query powyżej, jeśli chcesz, ale JPQL sama nie obsługują limitu, jak „jego”, zauważył.)

potem, gdy nazywając go użyć

PageRequest pageRequest = 
    new PageRequest(0, 1, Sort.Direction.DESC, "buildNumber"); 
Page<Artifact> artifactsPage = 
    artifactRepo.findByComponentKey(componentKey, pageRequest); 

pisałem różnych blogach na ten temat, które mogą okazać się pomocne:

http://springinpractice.com/blog/categories/chapter-02-data/

Powiązane problemy