sql >> Databasteknik >  >> RDS >> PostgreSQL

fjäderdata jpa onödig vänster gå med

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

motsvarar:

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

Notera @ManyToOne(optional = true) och @JoinColumn(nullable = true) . Detta betyder för ORM att sector attribut för Institucion är valfritt och kanske inte ställs in (till ett icke-nullvärde) hela tiden.

Tänk nu på följande arkiv:

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

  List<Institucion> findAllByInstitucionEmail(String email);
}

Med tanke på enhetsdeklarationen ovan bör lagringsmetoderna producera frågor som:

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

och

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

Detta beror på att enhetsmodellen indikerar sector att vara valfritt så ORM måste ladda Institucion utan att oroa sig för deras sector s.

Följande lagringsmetod följer detta mönster:

  List<Institucion> findAllBySector(Sector sector);

översätts till:

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

Om Institucion.sector är inte valfritt, gör det obligatoriskt i modellen också:

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

Om Institucion.sector är verkligen valfritt, bara en manuell fråga som den som visas i @MaciejKowalskis svar kommer att fungera.

Följande fråga kommer också att fungera:

  List<Institucion> findAllBySectorSectorId(Long id);

Detta förutsätter att modellattributnamnen är exakt som visas i inlägget.



  1. radera min. värden från poster efter att ha jämfört två värden från tabellen i sql

  2. Inner Join-tabell med avseende på ett maximalt värde

  3. MySQL välj/infoga/uppdatera, spelar kolumnordningen någon roll?

  4. SQL Server:Hämta tabell primärnyckel med SQL-fråga