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

春のデータjpa不要な左結合

    @Entity
    class Institucion {
      @ManyToOne(fetch=FetchType.LAZY)
      @JoinColumn(name="`sectorId`")
      private Sector sector;
    }
    

    と同等です:

    @Entity
    class Institucion {
      @ManyToOne(cascade = {}
                 , fetch=FetchType.LAZY
                 , optional = true
                 , targetEntity = void.class)
      @JoinColumn(columnDefinition = ""
                 , foreignKey = @ForeignKey
                 , insertable = true
                 , name="`sectorId`"
                 , nullable = true
                 , referencedColumnName = ""
                 , table = ""
                 , unique = false
                 , updatable = false)
      private Sector sector;
    }
    

    @ManyToOne(optional = true)に注意してください および@JoinColumn(nullable = true) 。これは、sectorがORMに Institucionの属性 はオプションであり、常に(null以外の値に)設定されるとは限りません。

    ここで、次のリポジトリについて考えてみましょう。

    public interface InstitucionRepository extends CrudRepository<Institucion, Long> {
      List<Institucion> findAllByInstitucionNombre(String nombre);
    
      List<Institucion> findAllByInstitucionEmail(String email);
    }
    

    上記のエンティティ宣言を考えると、リポジトリメソッドは次のようなクエリを生成する必要があります:

    select
        generatedAlias0 
    from
        Institucion as generatedAlias0 
    left join
        generatedAlias0.sector as generatedAlias1 
    where
        generatedAlias0.institucionNombre=:param0
    

    および

    select
        generatedAlias0 
    from
        Institucion as generatedAlias0 
    left join
        generatedAlias0.sector as generatedAlias1 
    where
        generatedAlias0.institucionEmail=:param0
    

    これは、エンティティモデルがsectorを示しているためです。 オプションであるため、ORMはInstitucionをロードする必要があります ssectorを気にせずに s。

    このパターンに従って、次のリポジトリメソッドを使用します。

      List<Institucion> findAllBySector(Sector sector);
    

    次のように変換されます:

    select
        generatedAlias0 
    from
        Institucion as generatedAlias0 
    left join
        generatedAlias0.sector as generatedAlias1 
    where
        generatedAlias1=:param0
    

    Institucion.sectorの場合 オプションではありません。モデルでも必須にします:

      @ManyToOne(fetch=FetchType.LAZY, optional = false)
      @JoinColumn(name="`sectorId`", nullable = false)
      private Sector sector;
    

    Institucion.sectorの場合 確かにオプションであり、@MaciejKowalskiの回答に示されているような手動クエリのみが機能します。

    次のクエリも機能します:

      List<Institucion> findAllBySectorSectorId(Long id);
    

    これは、モデルの属性名が投稿に示されているとおりであることを前提としています。



    1. SQLで週番号を抽出する方法

    2. OracleDecimalを切り捨て付きの.NET10進数に効率的に変換する

    3. Oracle10gのLISTAGG代替

    4. 数値を小数点以下2桁にフォーマットします