Nur die Grundkenntnisse in reinem Java und DB Das Spring-Projekt hat sich von Anfang an nach den Turbulenzen beruhigt. Bitte geben Sie uns Ihre Eindrücke und Ihr Memorandum. : language_balloon: Der Inhalt des Artikels ist mehr als ein Tutorial und weniger als eine Übung. Es wurde nicht bestätigt, dass der angegebene Code funktioniert, daher dient er nur als Referenz. : bete:
Red Hat (Entwicklungsumgebung ist Cent) 7-Serie Java8 SpringBoot2.1.6 MySQL8-Serie STS
Verwandte Begriffe sind schwierig. SpringDataJPA ist ein Framework, das eine JPA-Implementierung (Specification) (Hibernate) verwendet. Ich bin nicht zuversichtlich. Die für die dynamische Abfrageerstellung verwendete Kriterien-API ist eine JPA-Funktion, auf die Sie verweisen können. EclipseLink im Beispiel ist eine andere Implementierung als Hibernate, daher scheint es besser, nicht darauf zu verweisen. Aber [Seien Sie vorsichtig, da ich die Spring-Funktion anstelle der Hibernate-Funktion empfehle. ]] (https://qiita.com/suke_masa/items/392976749fce94a8ef1f#hibernate-validator%E3%81%AE-notblank-%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8Fbean-validation%E3%81%AE-notblank-%E3%82%92%E4%BD%BF%E3%81%86%E3%81%B9%E3%81%97)
Die Kenntnis des Lebenszyklus einer Entität kann dazu beitragen, verdächtiges Verhalten wie das Hinzufügen oder Entfernen von Eltern-Kind-Beziehungen oder explizite Transaktionen zu beheben. https://qiita.com/Maruo110/items/4dc4a49aedd6323ebfdb
H2DB In-Memory-Datenbank.
Da es in Spring enthalten ist, können Sie die Datenbank verwenden, ohne RDBMS in der Umgebung vorzubereiten. Es wird jedes Mal initialisiert, wenn Sie die App ausführen. Da es beiläufig verwendet werden kann, kann es für Prototypen und Tests verwendet werden.
Die SQL-Syntax ist nur in H2DB verfügbar. Sie können jedoch auch eine andere RDBMS-ähnliche Syntax mit der Option mode verwenden, sie ist jedoch nicht perfekt. http://www.h2database.com/html/features.html#compatibility Ich konnte herausfinden, wie der Index der create-Anweisung im MySQL-Modus angegeben wird. Ich konnte keine gespeicherten, Trigger, winzigen Zuordnungen usw. aufnehmen. Erstens, wenn es hier ein Problem zu sein scheint, bedeutet dies, dass es zu sehr von der Datenbank abhängt. : küssen:
Wenn Sie es einfach machen, wird es eine Klasse mit nur Tabelleninformationen sein, aber Sie können ziemlich viel tun. : erröten: Es sieht so aus, als könnten Sie die Daten verarbeiten. : blush: Auch Rückrufmethoden, die zum Zeitpunkt vor der Datenaktualisierung (Persistenz) aufgerufen werden können, sind praktisch. Wenn Sie Folgendes verwenden: Verwirrt: AuditingEntityListener, können Sie die DI-Zielklasse verwenden, das Testen ist jedoch schwierig. : verwirrt: Es kann vererbt werden, aber es funktioniert nicht gut mit Lombok. : wütend :: wütend :: wütend: "Ich habe vorerst versucht, es zu verschieben" Wenn Sie versuchen, es als eine Form zu verwenden, die manchmal in der Probe zu sehen ist, wird es im Handumdrehen kompliziert. Trennen Sie also Form und Entität richtig.
Employee.java
@Entity
@Data
class Employee {
@Id
private long id;
private String lastName;
private String firstName;
//Datenverarbeitung
public String getFullName(){
return this.lastName + this.firstName;
}
private Date updateDate;
//Rückrufmethode
@PreUpdate
private void preUpdate() {
setUpdateDate(new Date());
}
}
Der Verein ist Onimon. Informationen im Osten und Westen sind verwirrt. Wenn Sie nicht frühzeitig prüfen, ob es sich um Eins oder Viele, gegenseitige Bezugnahme, verzögertes Abrufen, Vorgang zum Zeitpunkt des Löschens usw. handelt, wird der Einflussbereich weinen. : Freude:
Wenn Sie eine Methode gemäß der Namenskonvention deklarieren, wird die Abfrage automatisch implementiert. Wenn Sie Zuordnungen für Anzahl, Existenz und Entität definiert haben, können Sie auch Spalten für verwandte Tabellen angeben (https://qiita.com/opengl-8080/items/05d9490d6f0544e2351a#%E3%83%A1%E3%82%) BD% E3% 83% 83% E3% 83% 89% E5% 90% 8D% E3% 81% 8B% E3% 82% 89% E3% 81% AE% E3% 82% AF% E3% 82% A8% E3% 83% AA% E8% 87% AA% E5% 8B% 95% E7% 94% 9F% E6% 88% 90). https://spring.pleiades.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation
Der Name ist in der Regel lang, daher ist es besser, ihn mit einem geeigneten Namen zu versehen.
Optional kann als Rückgabewert verwendet werden, verwenden Sie ihn also positiv.
findAll kann Suchbedingungen, Paging-Informationen und Sortierinformationen als Argumente übergeben. Fügen Sie beim Paging und Sortieren die Sortierbedingung in die Paging-Informationen ein. Beachten Sie, dass "select * ~" und "select count ~" beim Paging intern ausgegeben werden.
Ich habe die Spezifikation verwendet. Dies ist auch ein Dämonentor.
Die grundlegende Verwendung kann leicht eingeführt werden, aber wenn Sie versuchen, etwas ein wenig zu ändern, müssen Sie es oft verstehen. Insbesondere CriteriaAPI oder Lambda-Expression. Das Metamodell scheint nützlich zu sein, aber ich habe es diesmal nicht verwendet, weil es zu spät war, es zu wissen.
** ・ deutlich **
hogeSpecification.java
public Specification<Hoge> distinct() {
@Override
public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
cb.distinct(true);
return cb.equal(root.get("id"),root.get("id")); //Muss wahr sein. letzter Ausweg.
}
}
** etch holen **
Sie können sich mit root.join
verbinden, aber wenn Sie dies nicht angeben
select *
from a
innner join b1 on a.id = b1.id
innner join b2 on a.id = b2.id
where b1.id = {1}
and b2.name = {2};
SQL, das derselben Tabelle beitritt, wurde mehrfach ausgegeben. Ich verstehe die Ursache oder die Lösung nicht. : hankey:
Wenn Sie mit einer abgerufenen Abfrage blättern möchten, müssen Sie die folgende Beschreibung eingeben.
if (query.getResultType() != Long.class && query.getResultType() != long.class)
Dies liegt daran, dass "select * ~" und "select count ~" während des Paging ausgegeben werden, aber während des Zählens nicht abgerufen werden können. Daher muss dies vermieden werden. .. .. Eh? : hankey:
https://coderanch.com/t/656073/frameworks/Spring-Data-fetch-join-Specification
Basierend darauf sieht der Code so aus.
hogeSpecification.java
public Specification<Hoge> fetch() {
@Override
public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
if (query.getResultType() != Long.class && query.getResultType() != long.class){
root.fetch("childTable", JoinType.LEFT); //Die zu verbindende Tabelle wird von Entity definiert
}
return cb.equal(root.get("id"),root.get("id")) //Muss wahr sein. letzter Ausweg.
};
}
Es scheint, dass zwei oder mehr nicht abgerufen werden können und nicht für Eltern-Kind-Beziehungen verwendet werden können. Daher habe ich die Abfrageergebnisse verarbeitet und betrogen. Es ist schwierig. .. .. : hankey :: hankey:
** ・ Steuerung (bedingte Verzweigung, Schleife usw.) ** Wenn es sich um ein Beispiel handelt, können Sie alles mit einer Methodenkette verbinden, aber natürlich können Sie es in der Mitte schneiden. Die mehrspaltige Spezifikation der IN-Klausel in SQL (z. B. "where (name, id) in ((hoge, 1), (fuga, 2))") ist jetzt implementiert.
hogeService.java
public List<Hoge> serch(HogeForm form) {
Specification<hoge>Suchbedingungen=
Specification
.where(Suchbedingung 1)
.and(Suchbedingung 2);
//Bedingte Verzweigung
if(Verzweigungszustand)Suchbedingungen=Suchbedingungen.and(Zusätzliche Suchbedingungen);
//Wie eine Schleife
Specification<hoge>Suchbedingungen für Schleifen= null;
for(Schleife){
Suchbedingungen für Schleifen=Suchbedingungen für Schleifen.or(Wiederholte Suchbedingungen);
}
Suchbedingungen=Suchbedingungen.and(Suchbedingungen für Schleifen);
return hogeRepository.findAll(Suchbedingungen);
}
Memo nach dem ersten Frühlingsprojekt - Was ist Frühling? Memo nach dem ersten Frühjahrsprojekt-MVC-
Recommended Posts