Vorwort
Grundlegende Einführung in das Spring-DATA-JPA: Der Grund für die Geburt von JPA besteht darin, Orm-Frameworks von Drittanbietern zu integrieren und eine Standardmethode zu etablieren. Baidu Encyclopedia sagt, dass sich JDK in diese Richtung entwickelt, um die Einheit von ORM zu erreichen. Es wurde jedoch nicht vollständig implementiert. Im ORM -Framework ist Hibernate eine große Armee, die weit verbreitet ist, bequem und über starke Fähigkeiten verfügt. Gleichzeitig ist Hibernate auch gut in JPA integriert. Wir können denken, dass JPA der Standard ist, und in der Tat ist JPA fast alle Schnittstellen, und Implementierungen werden alle von Hibernate durchgeführt. Aus makroischer Sicht arbeitet Hibernate unter der Vereinigung von JPA sehr gut.
Vor kurzem habe ich Springboot- und Spring Data JPA verwendet. Wenn ich JPA benutze, kann ich die Datenbank bequemer machen, aber ich habe während der Verwendung viele Fallstricke gestoßen. Ich werde den folgenden Artikel aufzeichnen. Ich werde unten nicht viel sagen. Schauen wir uns die detaillierte Einführung gemeinsam an.
Szene:
Dynamische Abfrage, Paging -Abfrage, Abfragen verschiedener Datentabellen entsprechend der Verabschiedung von verschiedenen Zuständen und verwenden Sie die MAP, um VO vor dem Übergeben des Seitenobjekts zu konvertieren. Die unterschiedlichen Gebrauchsorte von vorliegbaren Auswirkungen beeinflussen die Richtigkeit der ausgelasteten Daten, sodass wir sie diskutieren.
Prämisse:
Das Seitenobjekt ist in VO beigefügt, und die Rückgabedaten enthält von Webdaten
@APimodelProperty ("record") private Seite <ActivityRecordvo> ActivityRecordvolist; @APimodelProperty ("Menge") private Integer num = 0; @APimodelProperty ("Betrag") Private BigDecimal TotalMoney = BigDecimal.ValueOp (0);Falsche Anwendung:
Liste <ActivityRecordvo> ActivityRecordvolist = New ArrayList <> (); if (reciveSendRecordRequestVo.getSendorreceivetype () == sendorreceivetype.receive) {list <ChallengerCord> ChallengerCordList = ChallengerCordDao.findByUseridandDeletetype (UserId, Deletetype.false); if (! CollectionUtils.isempty (ChallengerCordList)) {ActivityRecordvolist = ChallengerCordList.stream () .Map (this :: ChallengeCordToActivityRecordvo) .Collect (collectors.tolist ()); }} else if (reciveSendRecordRequestVo.getSendorreceivetype () == sendorreceivetype.send) {list <Activity> acctivityList = ActivityDao.findByUseridandDeletTeType (userId, deletetype.false); if (! CollectionUtils.isempty (ActivityList)) {ActivityRecordvolist = ActivityList.stream () .MAP (this :: ActivitytivityRecordvo) .Collect (collectors.tolist ()); }}ActivityRecesendRecordvo.SetActivityRecordvolist (new pageImpl <> (Aktivitätsrecordvolist, lehnte, Aktivitätsrecordvolist.Size ()));
Analyse: Das bestehende Pagable verwendet nur neue PageIml, um die Liste in ein Seitenobjekt zu konvertieren, wenn sie auf VO festgelegt werden. Obwohl die Gesamtzahl der Seiten und die Gesamtzahl der im Front-End gemeldeten Zeilen korrekt ist, ist die Anzahl der Zeilen auf der ersten Seite alles und die Daten sind abnormal!
Richtige Referenzmethode:
Verwenden Sie Spezifikationen, um das entsprechende Paging -Objekt dynamisch abzufragen und gemäß den Abfragebedingungen zu erordnen (dieser Blockcode variiert je nach Anforderungen). Zu diesem Zeitpunkt ist das in FindAll bestehende Pagable effektiv und die richtigen Paging -Informationen werden angezeigt.
Codeblockreferenz:
xxxcommonspecutil ist eine selbsternannte Spezifikations-Toolklasse, ähnlich der nativen Query-Methode der nativen Springdaten.
Seite <ActivityRecordvo> page = new PageImpl <> (Aktivitätsrecordvolist, lehnte, Aktivitätsrecordvolist.SIZE ()); if (receiveSendRecordRequestVO.getSendOrReceiveType() == SendOrReceiveType.RECEIVE) { Specifications<ChallengeRecord> spec = Specifications.where( challengeCommonSpecUtil.equal("userId", userId)) .and(challengeCommonSpecUtil.equal("deleteType", DeleteType.FALSE)); Page = ChallengereCorddao.findall (Spec, Leuchte) .MAP (this :: ChallengerCordToActivityRecordvo); } else if (reciveSendRecordRequestVo.getSendorreceivetype () == sendorreceivetype. Page = ActivityDao.findall (Spec, Leuchte) .Map (this :: ActivityTeActivityRecordvo); }Hinweis: ActivityRecesendRecordvo ist eingekapselt, das das zurückgegebene Seitenobjekt enthält
ActivityReceiveSendRecordvo.SetActivityRecordvolist (Seite);
Zusammenfassen
Nachdem ich so lange Frühlingsdaten JPA verwendet habe, denke ich, dass Spezifikationen sehr nützlich sind und nicht anfällig für Fehler sind. Es ist auch mein Lieblings -Kodierungsstil. Normalerweise verwende ich jedoch die einfache und rohe Methode von neuem PageImpl <> (), um Daten abzufragen und zu viele Tabellen zu verknüpfen. Ich werde am Ende direkt zurückkehren. Die tiefere Ebene muss wieder besprochen werden!
Okay, das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Referenzwert für das Studium oder die Arbeit eines jeden hat. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen. Vielen Dank für Ihre Unterstützung bei Wulin.com.