sql >> データベース >  >> RDS >> Mysql

SpringJPAにフィルター句を含むOneToManyの問題

    • select d from TKBData d JOIN d.columns c WHERE c.name = column1の意味

      1. columnが関連付けられているTKBDataオブジェクトを検索します nameの対象オブジェクト column1です
      2. どのTKBDataに少なくとも1つのcolumnがあるかが決まったら nameの対象オブジェクト column1です 、次に、関連するすべてのcolumnを返します オブジェクト これはJPAでは制御できません。 (別の質問に対する私の答え )。別の方法は、ネイティブSQLを記述し、カスタムの非エンティティオブジェクトを返すことです
      3. たとえば、TKBDATA_1があります column1を使用 およびcolumn2 関連して、TKBDATA_2もあります column3を使用 関連付けられています。
      4. クエリを実行すると、TKBDATA_2は無視されます そして、TKBDATA_1を返すことにしました。 少なくとも1つのcolumnがあるため nameのオブジェクト =column2しかしその後 関連するcolumnを制御することはできません TKBDATA_1に返すオブジェクト JPAは関連するすべての列オブジェクトを返します
      5. 理由がわからない場合は、Hibernateセッションについて読んでください。メモリ内の関連するエントリの一意のプレゼンテーションを提供する方法。これは、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クエリ言語に関しては、メモリ内のオブジェクトのコレクションをクエリするという観点から考えたいと思います。

    • それでは、次の2つのクエリの意味をオブジェクトの観点から説明してみてください。

       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と同じ結果を得るには、2番目のJPAクエリを使用します

    注:

    SQLクエリで左結合を使用した場合でも、whereも適用したため、これは事実上内部結合SQLクエリです。 その結合の最も適切なテーブルへの条件。



    1. MySQLコマンド:一般的なMySQLクエリのチートシート

    2. OracleSQL句の評価順序

    3. 行は明確に数えられません

    4. AndroidでSQLiteデータベースを処理するメソッドをテストする方法は?