2017-07-04 3 views
0

J'ai une requête en tête qui nécessite la pagination et je veux le construire avec Spring JPA. J'ai 3 tables, le détail, l'en-tête et la réclamation. Un enregistrement d'en-tête peut contenir plusieurs enregistrements de détail (enfants) et un mappage OneToMany. Une revendication n'a pas de relation avec l'en-tête mais les deux ont ce champ claim_num (pas la clé primaire) qui est la même valeur bien qu'il n'y ait pas de contraintes formelles. La revendication a aussi un champ 'lastName' que j'aimerais trier. Dans une mise en pension de détail extension JPARespository de printemps, j'avais construit une méthode avec @Query avec ce qui suit:JPQL trier par propriété sur une entité non liée de Repo

 @Query("select new MyDTO(d, h, c) from Detail d, Header h 
    left join Claim c on h.claimNum = c.claimNum") 
    Page<MyDTO> getSomeDetails(new Page(0, 10, new Sort("claim.lastName"))) 

Le but est d'obtenir des pages de détails et de valeurs d'en-tête et réclamation doivent être retournés dans le jeu de résultats bien. La commande par est mon empêchement actuel. Je reçois 'revendication n'est pas une propriété de détail'. Cela a du sens, mais les détails se rapportent formellement à l'en-tête, mais pour prétendre que rien n'est mappé. Comment le SQL généré peut-il obtenir l'ordre "correct" lors du passage en Page (Sort()) au niveau du détail? Merci d'avoir lu et toute aide est appréciée. C'est le démarrage de printemps mais mis à jour vers Hibernate-Core 5.1.

Répondre

0

Ce que j'ai découvert a eu quelques problèmes majeurs. Particulièrement pour le nombre de lignes. J'ai fini par refaire ça beaucoup et j'ai quelque chose de vraiment moche. J'avais à l'origine suivi un exemple here pendant que je rejoignais des entités non liées et pensais que j'avais quelque chose qui fonctionnait mais le nombre de lignes était complètement faux. La base de données de test que j'utilisais n'avait qu'un maximum de 150 lignes, mais le nombre de lignes était de quelque 47 000, donc le résultat était en train de gonfler. J'ai ajouté plus jointures et l'ordre codé en dur et a fini par avec:

select new AdjusterSortDTO(detail, rfsth, rule, cm) 
From Detail detail 
left join Rule rule on rule.Detail.DetailId=detail.DetailId 
left join Header rfsth on rfsth.headerId=detail.header.headerId 
left join ClaimMaster cm 
on rfsth.claimNum = cm.claimNum order by cm.adjusterEmail 

À ce stade ne sais pas si cette question sera utile à quelqu'un d'autre.