Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Probleme mit OneToMany einschließlich einer Filterklausel im Frühjahr jpa

  • Bedeutung von select d from TKBData d JOIN d.columns c WHERE c.name = column1 ist

    1. Suchen Sie ein TKBData-Objekt, bei dem es eine zugehörige column hat Objekt für das name ist column1
    2. Sobald entschieden ist, welche TKBData mindestens eine column hat Objekt für das name ist column1 , dann werden alle zugehörigen column zurückgegeben Objekte über die Sie in JPA keine Kontrolle haben. (siehe Meine Antwort auf eine andere Frage ). Alternativ können Sie natives SQL schreiben und benutzerdefinierte Objekte zurückgeben, die keine Entitäten sind
    3. Zum Beispiel haben Sie TKBDATA_1 mit column1 und column2 zugeordnet, haben Sie auch TKBDATA_2 mit column3 verbunden.
    4. Wenn Sie Ihre Abfrage ausführen, wird TKBDATA_2 ignoriert und beschließt, TKBDATA_1 zurückzugeben da es mindestens eine column hat Objekt mit name =column2 . Aber danach Sie haben keine Kontrolle darüber, welche column zugeordnet ist Objekte, die für TKBDATA_1 zurückgegeben werden sollen und JPA gibt alle zugeordneten Spaltenobjekte zurück
    5. Wenn Sie sich über den Grund nicht sicher sind, lesen Sie mehr über die Ruhezustandssitzung. Wie sie eine eindeutige Darstellung aller zugehörigen Einträge im Speicher bietet. Es ist die Grundlage für seine dirty checking und repeatable read
  • Aktualisieren Sie Ihr @OneToMany wie folgt

   @OneToMany(fetch = FetchType.EAGER, 
           cascade = CascadeType.ALL, orphanRemoval = true)
   @Builder.Default
   @JoinTable(name = "TKBDATA_TKBCOLUMN", 
           joinColumns = @JoinColumn(name = "TKBDATA_ID"), 
           inverseJoinColumns = @JoinColumn(name = "COLUMNS_ID"))
   private Set<TKBColumn> columns = Sets.newHashSet();
  • Wenn es um die JPA-Abfragesprache geht, würde ich gerne als Abfrage eine Sammlung von In-Memory-Objekten betrachten.

  • Versuchen Sie nun, die Bedeutung der folgenden beiden Abfragen in Bezug auf Objekte zu beschreiben.

   select d from TKBData d LEFT JOIN d.columns c WHERE c.name = :name
           vs
   select d from TKBData d JOIN d.columns c WHERE c.name = :name
  • Vergessen Sie nicht, anders als in SQL, wo Sie Spalten auswählen, hier Sie gesagt haben, dass Sie TKBData-Objekte auswählen und einschränken möchten, welche TKBData-Objekte zurückgegeben werden sollen.

  • Verwenden Sie also die zweite JPA-Abfrage

    , um das gleiche Ergebnis wie mit Ihrer nativen SQL zu erzielen

Hinweis:

Obwohl Sie in Ihrer SQL-Abfrage einen linken Join verwendet haben, handelt es sich effektiv um eine SQL-Abfrage mit innerem Join, da Sie auch ein where angewendet haben Bedingung an die Tabelle ganz rechts in diesem Join.