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?)?
3 Réponses :
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);
Vous devez probablement utiliser countQuery pour que la pagination fonctionne avec une requête native.
SELECT expression1, expression2, ... expression_n,
fonction_agrégation (expression_agrégation)
FROM tables
[Conditions WHERE]
GROUP BY expression1, expression2, ... expression_n;
Dans votre requête, il manque une fonction_agrégation telle que SUM, COUNT, MIN, MAX ou AVG .
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
Je pense que ce lien peut vous aider.