sql >> Databasteknik >  >> RDS >> Mysql

problem med OneToMany inklusive en filterklausul i spring jpa

  • Betydelse av select d from TKBData d JOIN d.columns c WHERE c.name = column1 är

    1. Hitta ett TKBData-objekt där det har en associerad column objekt för vilket name är column1
    2. När det har bestämts vilken TKBData som har minst en column objekt för vilket name är column1 , så returnerar den alla dess associerade column föremål som du inte har kontroll över i JPA. ( se Mitt svar på en annan fråga ). Alternativet är att skriva inbyggd sql och returnera anpassade icke-entitetsobjekt
    3. Du har till exempel TKBDATA_1 med column1 och column2 associerad har du också TKBDATA_2 med column3 associerade.
    4. När du kör din fråga ignorerar den TKBDATA_2 och bestämmer sig för att returnera TKBDATA_1 eftersom den har minst en column objekt med name =column2 . Men efter det du har inte kontroll över vilken associerad column objekt att returnera för TKBDATA_1 och JPA returnerar alla associerade kolumnobjekt
    5. Om du inte är säker på orsaken, läs om vilolägessession. Hur det ger en unik presentation av alla tillhörande poster i minnet. Det är grunden för dess dirty checking och repeatable read
  • Uppdatera din @OneToMany enligt följande

   @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();
  • När det kommer till JPA-frågespråk, skulle jag vilja tänka i termer av fråga en samling av objekt i minnet.

  • Så försök nu att beskriva innebörden av följande två frågor i termer av objekt.

   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
  • Glöm inte till skillnad från i sql där du är markera några kolumner här har du sagt att du vill välja TKBData-objekt och begränsa vilka TKBData-objekt som ska returneras.

  • Så för att uppnå samma resultat som för din inbyggda sql, använd den andra JPA-frågan

Obs!

Även om du använde en vänster-join i din SQL-fråga, är det faktiskt en inre join-sql-fråga eftersom du också har använt en where skick till den mest rätta tabellen på den sammanfogningen.



  1. Saknar oanvända mysql-anslutningar ner skript?

  2. Hur hämtar man mikrosekunder eller millisekunder från MySQL aktuell tid?

  3. psycopg2 infogar faktiskt inte data

  4. En datamodell för handel med aktier, fonder och kryptovalutor