PostgreSQL
 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) . Това означава за ORM, че sector атрибут на Institucion не е задължително и не може да бъде зададено (на ненулева стойност) през цялото време.

Сега разгледайте следното хранилище:

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 s без да се тревожат за своя sector с.

Следвайки този модел, следният метод на хранилище:

  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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. pg_dump без коментари за обекти?

  2. sequelize изберете и включете друг псевдоним на таблица

  3. Rails &Postgresql:как да групирате заявки по час?

  4. как да изпълним .sql скрипт на heroku?

  5. Как да рестартирате Postgresql