2014-03-12 7 views
34

Ich verwende Spring Data JPA, und wenn ich @Query verwenden, um eine Abfrage OHNEPageable zu definieren, es funktioniert:Federdaten JPA @query und seitenwechselbar

public interface UrnMappingRepository extends JpaRepository<UrnMapping, Long> { 
    @Query(value = "select * from internal_uddi where urn like %?1% or contact like %?1%", 
      nativeQuery = true) 
    List<UrnMapping> fullTextSearch(String text); 
} 

Aber wenn ich hinzufügen zweite param Pageable, die @Query wird nicht funktionieren, und Spring wird den Namen der Methode analysieren, dann werfen Sie die AusnahmeNo property full found. Ist das ein Fehler?

public interface UrnMappingRepository extends JpaRepository<UrnMapping, Long> { 
    @Query(value = "select * from internal_uddi where urn like %?1% or contact like %?1%", 
      nativeQuery = true) 
    Page<UrnMapping> fullTextSearch(String text, Pageable pageable); 
} 

Antwort

23

Eine ähnliche Frage war asked on the Spring forums, wo es war, dass die Paginierung anzuwenden darauf hingewiesen, eine zweite Unterabfrage abgeleitet werden muss. Da die Unterabfrage auf dieselben Felder verweist, müssen Sie sicherstellen, dass Ihre Abfrage Aliase für die Entitäten/Tabellen verwendet, auf die sie verweist. Das bedeutet, dass, wo Sie schrieb:

select * from internal_uddi where urn like 

Sie sollten stattdessen haben:

select * from internal_uddi iu where iu.urn like ... 
+0

Leider funktioniert das nicht mit nativer Abfrage. Weißt du, ob es möglich ist, mit nativer Abfrage zu erreichen? – vtor

+5

Wenn Sie native Abfragen schreiben möchten, müssen Sie die Abfrage natürlich selbst schreiben. – Steve

3

Bedenkt man, dass die UrnMapping Klasse in die internal_uddi Tabelle abgebildet wird, würde ich dies vorschlagen:

@Repository 
public interface UrnMappingRepository extends JpaRepository<UrnMapping, Long> { 

    @Query(value = "select iu from UrnMapping iu where iu.urn like %:text% or iu.contact like %:text%") 
    Page<UrnMapping> fullTextSearch(@Param("text") String text, Pageable pageable); 
} 

Beachten Sie, dass Sie native Abfragen möglicherweise mit dynamischen Anfragen deaktivieren müssen.

13

Sie können die Seitennumerierung mit einer systemeigenen Abfrage verwenden. Es wird hier dokumentiert: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.at-query

:

Sie jedoch nativen Abfragen für Paginierung sich die Zählung Abfrage durch die Angabe verwenden können Beispiel 51 nativen @Query unter Verwendung bei der Abfragemethode Count-Abfragen für die Paginierung Deklarieren“
public interface UserRepository extends JpaRepository<User, Long> { 

    @Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1", 
    countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1", 
    nativeQuery = true) 
    Page<User> findByLastname(String lastname, Pageable pageable); 
}