sql >> Database teknologi >  >> RDS >> Mysql

problemer med OneToMany inklusive en filterklausul i spring jpa

  • Betydning af select d from TKBData d JOIN d.columns c WHERE c.name = column1 er

    1. Find et TKBData-objekt, hvor det har en tilknyttet column objekt for hvilket name er column1
    2. Når det er besluttet, hvilken TKBData der har mindst én column objekt for hvilket name er column1 , så returnerer den hele dens tilknyttede column genstande som du ikke har kontrol over i JPA. ( se Mit svar på et andet spørgsmål ). Alternativet er at skrive native sql og returnere tilpassede ikke-entitetsobjekter
    3. Du har f.eks. TKBDATA_1 med column1 og column2 tilknyttet, har du også TKBDATA_2 med column3 tilknyttet.
    4. Når du kører din forespørgsel, ignorerer den TKBDATA_2 og beslutter sig for at returnere TKBDATA_1 da den har mindst én column objekt med name =column2 . Men efter det du har ikke kontrol over, hvilken tilknyttet column objekter, der skal returneres for TKBDATA_1 og JPA returnerer alle tilknyttede kolonneobjekter
    5. Hvis du ikke er sikker på årsagen, så læs om dvale-session. Hvordan det giver en unik præsentation af enhver tilknyttet post i hukommelsen. Det er grundlaget for dens dirty checking og repeatable read
  • Opdater din @OneToMany som følger

   @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 til JPA-forespørgselssprog, vil jeg gerne tænke på en samling af objekter i hukommelsen i form af forespørgsler.

  • Så prøv nu at beskrive betydningen af ​​de følgende to forespørgsler i form af objekter.

   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
  • Glem ikke, i modsætning til i sql, hvor du skal vælge en hvilken som helst kolonne her, du har sagt, at du vil vælge TKBData-objekter og begrænse, hvilke TKBData-objekter, der skal returneres.

  • Så for at opnå det samme resultat som for din oprindelige sql, brug den anden JPA-forespørgsel

Bemærk:

Selvom du brugte en venstre join i din sql-forespørgsel, er det faktisk en indre join-sql-forespørgsel, fordi du også har anvendt en where tilstand til den mest rigtige tabel på den join.



  1. Få sidst slettede ID i MySQL

  2. Hvordan kan jeg midlertidigt deaktivere en fremmednøglebegrænsning i MySQL?

  3. SQL Server-synkronisering til MySQL-program

  4. SQLite-data til en RecyclerView