PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

musim semi data jpa tidak perlu kiri bergabung

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

setara dengan:

@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;
}

Catatan @ManyToOne(optional = true) dan @JoinColumn(nullable = true) . Ini menandakan ORM bahwa sector atribut Institucion bersifat opsional dan tidak boleh disetel (ke nilai bukan nol) sepanjang waktu.

Sekarang perhatikan repositori berikut:

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

  List<Institucion> findAllByInstitucionEmail(String email);
}

Mengingat deklarasi entitas di atas, metode repositori harus menghasilkan kueri seperti:

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

dan

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

Ini karena model entitas menunjukkan sector menjadi opsional sehingga ORM perlu memuat Institucion s tanpa mengkhawatirkan sector mereka s.

Mengikuti pola ini, metode repositori berikut:

  List<Institucion> findAllBySector(Sector sector);

diterjemahkan menjadi:

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

Jika Institucion.sector bukan opsional, buat juga wajib di model:

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

Jika Institucion.sector memang opsional, hanya kueri manual seperti yang ditunjukkan pada jawaban @MaciejKowalski yang akan berfungsi.

Kueri berikut juga akan berfungsi:

  List<Institucion> findAllBySectorSectorId(Long id);

Ini mengasumsikan bahwa nama atribut model persis seperti yang ditunjukkan dalam postingan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jatuhkan semua fungsi dari database Postgres

  2. Migrasi Jalur Terbang dengan java

  3. Pengecualian C# SqlConnection:Kata Kunci tidak Didukung 'Port'

  4. PostgreSQL menemukan kombinasi umum pasangan pada kolom yang sama

  5. Heroku - ActionView::Template::Error (PG::Error:ERROR:kolom category_products.desc tidak ada