Mysql
 sql >> Baza danych >  >> RDS >> Mysql

problemy z OneToMany zawierające klauzulę filtrującą w wiosennym jpa

  • Znaczenie select d from TKBData d JOIN d.columns c WHERE c.name = column1 jest

    1. Znajdź obiekt TKBData, z którym jest powiązana column obiekt, dla którego name to column1
    2. Po ustaleniu, który TKBData ma przynajmniej jedną column obiekt, dla którego name to column1 , zwróci wszystkie powiązane column obiekty nad którymi nie masz kontroli w JPA. ( patrz Moja odpowiedź na inne pytanie ). Alternatywą jest napisanie natywnego sql i zwrócenie niestandardowych obiektów niebędących obiektami
    3. Na przykład masz TKBDATA_1 z column1 i column2 powiązane, masz również TKBDATA_2 z column3 powiązane.
    4. Gdy uruchomisz zapytanie, zignoruje ono TKBDATA_2 i postanawia zwrócić TKBDATA_1 ponieważ ma co najmniej jedną column obiekt z name =column2 . Ale potem nie masz kontroli nad powiązaną column obiekty do zwrócenia dla TKBDATA_1 a JPA zwróci wszystkie powiązane obiekty kolumn
    5. Jeśli nie jesteś pewien przyczyny, przeczytaj o sesji hibernacji.Jak zapewnia unikalną prezentację każdego powiązanego wpisu w pamięci. Jest to podstawa jego dirty checking i repeatable read
  • Zaktualizuj swój @OneToMany w następujący sposób

   @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();
  • Jeśli chodzi o język zapytań JPA, chciałbym myśleć w kategoriach zapytań o kolekcję obiektów w pamięci.

  • Spróbuj teraz opisać znaczenie poniższych dwóch zapytań w kategoriach obiektów.

   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
  • Nie zapomnij, inaczej niż w sql, gdzie wybierasz tutaj dowolne kolumny, o których powiedziałeś, że chcesz wybrać obiekty TKBData i ograniczyć, które obiekty TKBData mają być zwracane.

  • Aby osiągnąć ten sam wynik, co w natywnym sql, użyj drugiego zapytania JPA

Uwaga:

Nawet jeśli użyłeś lewego sprzężenia w zapytaniu sql, jest to faktycznie wewnętrzne zapytanie sql, ponieważ zastosowałeś również where warunek do najbardziej prawego stołu na tym połączeniu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oblicz decyla z częstotliwości w MySQL

  2. hibernate, mysql, glassfish v3 i źródło danych JTA

  3. zapytanie nie jest równe nie działa

  4. Wyodrębnij podciąg z określonym wzorcem w MySql

  5. Jak skonfigurować niestandardowy MySQL NHibernate Batcher?