sql >> Database >  >> RDS >> Mysql

problemen met OneToMany inclusief een filterclausule in spring jpa

  • Betekenis van select d from TKBData d JOIN d.columns c WHERE c.name = column1 is

    1. Zoek een TKBData-object met een bijbehorende column object waarvoor name is column1
    2. Zodra is besloten welke TKBData ten minste één column heeft object waarvoor name is column1 , dan retourneert het alle bijbehorende column objecten waar je geen controle over hebt in JPA. ( zie Mijn antwoord op een andere vraag ). Alternatief is om native sql te schrijven en aangepaste niet-entiteitsobjecten te retourneren
    3. Je hebt bijvoorbeeld TKBDATA_1 met column1 en column2 gekoppeld, heb je ook TKBDATA_2 met column3 gekoppeld.
    4. Wanneer u uw zoekopdracht uitvoert, negeert deze TKBDATA_2 en besluit TKBDATA_1 terug te sturen omdat het ten minste één column . heeft object met name =column2 . Maar daarna je hebt geen controle over welke gekoppelde column objecten om te retourneren voor TKBDATA_1 en JPA retourneert alle gekoppelde kolomobjecten
    5. Als je niet zeker bent van de reden, lees dan over de slaapstand. Hoe het een unieke presentatie geeft van alle bijbehorende items in het geheugen. Het is de basis voor zijn dirty checking en repeatable read
  • Update uw @OneToMany als volgt

   @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();
  • Als het gaat om JPA-querytaal, zou ik willen denken in termen van het opvragen van een verzameling in-memory-objecten.

  • Probeer nu dus de betekenis van de volgende twee zoekopdrachten in termen van objecten te beschrijven.

   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
  • Vergeet niet dat in tegenstelling tot sql waar je kolommen selecteert die je hebt gezegd dat je TKBData-objecten wilt selecteren en dat je beperkt welke TKBData-objecten moeten worden geretourneerd.

  • Dus om hetzelfde resultaat te bereiken als van uw native sql, gebruikt u de tweede JPA-query

Opmerking:

Ook al heb je een left join gebruikt in je sql-query, het is in feite een inner join sql-query omdat je ook een where hebt toegepast voorwaarde naar de meest rechtse tafel op die join.



  1. Is een MySQL-procedurethread veilig?

  2. LEFT JOIN na GROUP BY?

  3. Oracle Insert Select met bestellen door

  4. mysql-query - blogposts en opmerkingen met limiet