Mysql
 sql >> база данни >  >> RDS >> Mysql

проблеми с OneToMany, включително клауза за филтър в spring jpa

  • Значение на select d from TKBData d JOIN d.columns c WHERE c.name = column1 е

    1. Намерете TKBData обект, където има свързана column обект, за който name е column1
    2. След като реши кой TKBData има поне една column обект, за който name е column1 , тогава ще върне всички свързани с него column предмети които нямате контрол в JPA. ( вижте Моят отговор на друг въпрос ). Алтернатива е да напишете естествен sql и да върнете персонализирани обекти, които не са обект
    3. Например имате TKBDATA_1 с column1 и column2 свързан, имате и TKBDATA_2 с column3 свързани.
    4. Когато изпълните заявката си, тя ще игнорира TKBDATA_2 и решава да върне TKBDATA_1 тъй като има поне една column обект с name =column2 . Но след това нямате контрол върху това коя свързана column обекти за връщане за TKBDATA_1 и JPA ще върне всички свързани колонни обекти
    5. Ако не сте сигурни за причината, прочетете за сесията на хибернация. Как предоставя уникално представяне на всеки свързан запис в паметта. Това е основата за неговата dirty checking и repeatable read
  • Актуализирайте своя @OneToMany както следва

   @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();
  • Що се отнася до езика за заявки JPA, бих искал да мисля по отношение на заявката за колекция от обекти в паметта.

  • Така че сега се опитайте да опишете значението на следните две заявки от гледна точка на обекти.

   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
  • Не забравяйте за разлика от sql, където избирате всички колони тук, за които сте казали, че искате да изберете TKBData обекти и сте ограничили кои TKBData обекти да се връщат.

  • Така че, за да постигнете същия резултат като от вашия роден sql, използвайте втората JPA заявка

Забележка:

Въпреки че сте използвали ляво присъединяване във вашата sql заявка, това на практика е вътрешна заявка за присъединяване, защото сте приложили и where условие към най-дясната маса на това съединение.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Неправилна стойност на низа:„\xEF\xBF\xBD“ за колона

  2. Google Apps Script, JDBC и MySQL не работят с дата 0000-00-00

  3. Как да се обърна към OSError:грешка mysql_config не е намерена по време на внедряването на Elastic Beanstalk?

  4. Как да включите mysql в урока за бърз старт на Jboss

  5. Entity Framework + генериране на клас MySQL