J'utilise Spring Data JPA et lorsque j'utilise @Query
pour définir une requête [~ # ~] sans [~ # ~] Pageable
, Ça marche:
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);
}
Mais si j'ajoute le deuxième paramètre Pageable
, le @Query
ne fonctionnera PAS et Spring analysera le nom de la méthode, puis lancera le exceptionNo property full found
. Est-ce un bug?
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);
}
Une question similaire était posée sur les forums Spring , où il a été souligné que pour appliquer la pagination, une deuxième sous-requête doit être dérivée. Étant donné que la sous-requête fait référence aux mêmes champs, vous devez vous assurer que votre requête utilise des alias pour les entités/tables auxquelles elle fait référence. Cela signifie que là où vous avez écrit:
select * from internal_uddi where urn like
Vous devriez plutôt avoir:
select * from internal_uddi iu where iu.urn like ...
Vous pouvez utiliser la pagination avec une requête native. Il est documenté ici: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#_native_queries
" Vous pouvez toutefois utiliser des requêtes natives pour la pagination en spécifiant vous-même la requête de comptage: Exemple 59. Déclare des requêtes de comptage natives pour la pagination à la méthode de requête à l'aide de @Query "
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);
}
Considérant que la classe UrnMapping
est associée à la classe internal_uddi
table, je suggérerais ceci:
@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);
}
Veuillez noter que vous devrez peut-être désactiver les requêtes natives avec des requêtes dynamiques.
Réécrivez votre requête pour:
select iu from internal_uddi iu where iu.urn....
description: http://forum.spring.io/forum/spring-projects/data/126415-is-it-possible-to-use-query-and-pageable?p=611398#post611398
J'ai trouvé que cela fonctionnait différemment selon les versions de jpa. Pour le débogage, vous feriez mieux d'ajouter cette configuration pour afficher le SQL généré, cela vous fera économiser beaucoup de temps!
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
pour les bottes de printemps 2.1.6.LELEASE, ça marche bien!
Sort sort = new Sort(Sort.Direction.DESC, "column_name");
int pageNumber = 3, pageSize = 5;
Pageable pageable = PageRequest.of(pageNumber - 1, pageSize, sort);
@Query(value = "select * from integrity_score_view " +
"where (?1 is null or data_hour >= ?1 ) " +
"and (?2 is null or data_hour <= ?2 ) " +
"and (?3 is null or ?3 = '' or park_no = ?3 ) " +
"group by park_name, data_hour ",
countQuery = "select count(*) from integrity_score_view " +
"where (?1 is null or data_hour >= ?1 ) " +
"and (?2 is null or data_hour <= ?2 ) " +
"and (?3 is null or ?3 = '' or park_no = ?3 ) " +
"group by park_name, data_hour",
nativeQuery = true
)
Page<IntegrityScoreView> queryParkView(Date from, Date to, String parkNo, Pageable pageable);
vous n'écrivez pas order by
et limit
, il génère le bon SQL
Veuillez faire référence à: Spring Data JPA @Query , si vous utilisez Spring Data JPA version 2.0.4 et ultérieure. Échantillon comme ci-dessous:
@Query(value = "SELECT u FROM User u ORDER BY id")
Page<User> findAllUsersWithPagination(Pageable pageable);