2
votes

Pagination et regroupement de Spring Data JpaRepository

Dans mon interface JpaRepository, j'ai la méthode suivante qui fonctionne très bien:

@Column(name = "object_reference", nullable = false)
private String objectReference;

Ce dont j'ai besoin est la même requête avec un groupe par object_reference.

Voici ce dont J'ai essayé de faire: MODIFIER

@Query(value = "SELECT object_reference, dst_type, other FROM permission_rule pr WHERE pr.organization_id = %?1% AND pr.dst_type_id = %?2% AND pr.object_reference LIKE %?3% GROUP BY object_reference", nativeQuery = true)
Page<PermissionRule> getFunds(Long organizationId, String dstTypeId, String searchTerm, Pageable pageable);

mais j'obtiens l'erreur suivante

InvalidJpaQueryMethodException: impossible d'utiliser des requêtes natives avec un tri dynamique et / ou une pagination dans la méthode

Aussi si cela aide ma colonne d'entité que je veux utiliser dans GROUP BY est

Page<PermissionRule> findByOrganizationIdAndTypeStringAndObjectReferenceIgnoreCaseContaining(
        Long organizationId, String typeId, String searchTerm, Pageable pageable);

Ma question est de savoir s'il existe un moyen plus simple de le faire ou j'ai toujours besoin d'une requête personnalisée (dois-je déplacer la requête personnalisée dans l'entité peut-être ou utiliser une requête nommée à la place?)?


1 commentaires

Je pense que ce lien peut vous aider.


3 Réponses :


0
votes

Vous utilisez généralement un groupBy lorsque vous souhaitez agréger les résultats. Ici, vous faites select * au lieu de l'agrégation.

@Query(value = "SELECT someCol, count(*) as numRows from SomeTable GROUP BY someCol",
            countQuery= "SELECT count(*) FROM (SELECT someCol, count(*) as numRows from SomeTable GROUP BY someCol)",
            nativeQuery=true)
    Page<Something> findSomething(Pageable pageable);

L'objet Something peut être une interface avec des méthodes getter pour someCol et numOfRows.

Si vous utilisez une requête native, vous avez besoin pour utiliser countQuery

@Query("SELECT l.someCol, count(*) as numOfRows from SomeTable l GROUP BY l.someCol")
    Page<Something> findSomething(Pageable pageable);


1 commentaires

Vous devez probablement utiliser countQuery pour que la pagination fonctionne avec une requête native.




0
votes

Ignorant pourquoi je dois faire un Group By sans agrégat, j'ai trouvé ma solution:

@Query("SELECT pr FROM PermissionRule pr WHERE pr.organizationId = ?1 AND pr.type = ?2 GROUP BY objectReference")
Page<PermissionRule> getFunds(Long organizationId, String type, Pageable pageable);

Cela semble plus simple que l'approche native_query.

Utile lien


0 commentaires