Préface
Introduction de base à Spring-Data-JPA: La raison de la naissance de JPA est d'intégrer des cadres ORM tiers et d'établir une méthode standard. Baidu Encyclopedia dit que JDK se développe dans ce sens afin d'atteindre l'unité d'ORM. Cependant, il n'a pas été entièrement implémenté. Dans le cadre ORM, Hibernate est une grande armée, largement utilisée, pratique et a de fortes capacités. Dans le même temps, Hibernate est également bien intégré à JPA. Nous pouvons penser que JPA est la norme, et en fait, JPA est presque toutes les interfaces, et les implémentations sont toutes réalisées par Hibernate. Du point de vue macro, Hibernate fonctionne très bien sous l'unification de JPA.
Récemment, j'utilise Springboot et Spring Data JPA. L'utilisation de JPA peut me rendre plus pratique pour faire fonctionner la base de données, mais j'ai rencontré de nombreux pièges pendant l'utilisation. J'enregistrerai l'article suivant. Je ne dirai pas beaucoup en dessous. Jetons un coup d'œil à l'introduction détaillée ensemble.
Scène:
Requête dynamique, requête de pagination, interroger différentes tables de données selon différents états passés et utiliser la carte pour convertir VO avant de passer dans l'objet page. Les différents lieux d'utilisation de pagible affectent l'exactitude des données paginées, nous en discuterons donc.
prémisse:
L'objet Page est enfermé dans VO, et les données de retour comprennent des données paginées
@Apimodelproperty ("enregistrement") Page privée <ActivityRecordvo> ActivityRecordVolist; @apimodelProperty ("Quantity") private Integer num = 0; @apimodelproperty ("montant") private bigdecimal totalmoney = bigdecimal.valueof (0);Application incorrecte:
List <activityRecordvo> ActivityRecordVolist = new ArrayList <> (); if (receivesEnDrecorDrequestvo.getSendorReceIveType () == SendorReceiveType.receive) {list <ChallengerCord> ChallengerCordList = ChallengerCorddao.FindByUseRidAndDeletType (Userid, DeleteType.False); if (! CollectionUtils.Isempty (ChallengerCordList)) {ActivityRecordVolist = ChallengerCordList.Stream () .Map (this :: ChallengerCordToActivityRecordvo) .Collect (Collectors.tolist ()); }} else if (receivesenDrecorDrequestvo.getSendorReceIveType () == sendorReceiveType.send) {list <activité> activitéList = activitédao.findByUserIdAndDeteTyTy (userId, DeleTetyT.false); if (! CollectionUtils.Isempty (ActivityList)) {ActivityRecordVolist = ActivityList.Stream () .map (this :: ActivityToActivityRecordvo) .Collect (Collectors.tolist ()); }}ActivityReceiveSenDRecordvo.SetActivityRecordVolist (new PageImpl <> (ActivityRecordVolist, Pagable, ActivityRecordVolist.size ()));
Analyse: Le Pagable passé utilise uniquement la nouvelle pageMl pour convertir la liste en objet Page lorsqu'il est défini sur VO. Bien que le nombre total de pages et le nombre total de lignes signalés dans le frontal soient corrects, le nombre de lignes sur la première page est tout et les données sont anormales!
Méthode de référence correcte:
Utilisez des spécifications pour interroger dynamiquement et cartographier l'objet de pagination correspondant en fonction des conditions de requête (ce code de bloc varie en fonction des exigences). À l'heure actuelle, le pagible passé dans Findall est efficace et les informations de pagination correctes seront affichées.
Référence du bloc de code:
XXXCommonspecutil est une classe d'outils de spécification autoproclamée, similaire à la méthode de requête native des données Spring native.
Page <ActivityRecordvo> Page = new PageImpl <> (ActivityRecordVolist, Pagable, ActivityRecordVolist.size ()); if (receivesEndreCorDrequestvo.getSendorReceIveType () == SendorReceiveType.receive) {Spécifications <ChallengerCord> Spec = Spécifications.Where (ChallengeCommonspecutil.equal ("DeleType", UserId)) .and (ChallengeCommonspecutil.equal ("DeleType", DeleTeType.falilse); page = challengerecorddao.findall (spec, pagable) .map (this :: challengerecordtoactivityRecordvo); } else if (receivesEnDrecorDrequestvo.getSendorReceIveType () == sendorreceiveType.send) {Spécifications <Activity> spec = Spécifications.Where (ActivityCommonspecutil.equal ("userrid", userId)) .and (ActivityCommonspecutil.equal ("DeleType", DeleTetype.false); page = activitédao.findall (spec, pagable) .map (this :: activityToActivityRecordvo); }Remarque: ActivityReceiveSenDrecordvo est encapsulé VO, qui contient l'objet de page retourné
ActivityReceiSeNDreCordvo.SetActivityRecordVolist (page);
Résumer
Après avoir utilisé Spring Data JPA pendant si longtemps, je pense que les spécifications sont très utiles et non sujets aux erreurs. C'est aussi mon style d'encodage préféré. Cependant, j'utilise généralement la méthode simple et brute de la nouvelle pagempl <> () pour interroger les données et associer trop de tables. Je reviendrai directement à la fin. Le niveau plus profond doit être discuté à nouveau!
D'accord, ce qui précède est l'intégralité du contenu de cet article. J'espère que le contenu de cet article a une certaine valeur de référence pour l'étude ou le travail de chacun. Si vous avez des questions, vous pouvez laisser un message pour communiquer. Merci pour votre soutien à wulin.com.