sql >> Base de Datos >  >> RDS >> Mysql

problemas con OneToMany incluyendo una cláusula de filtro en spring jpa

  • Significado de select d from TKBData d JOIN d.columns c WHERE c.name = column1 es

    1. Encuentre un objeto TKBData donde tenga una column asociada objeto para el cual name es column1
    2. Una vez que se decide qué TKBData tiene al menos una column objeto para el cual name es column1 , entonces devolverá todas sus column asociadas objetos sobre el que no tienes control en JPA. (ver Mi respuesta a otra pregunta ). La alternativa es escribir sql nativo y devolver objetos personalizados que no sean entidades
    3. Por ejemplo, tiene TKBDATA_1 con column1 y column2 asociado, también tienes TKBDATA_2 con column3 asociado.
    4. Cuando ejecute su consulta, ignorará TKBDATA_2 y decide devolver TKBDATA_1 ya que tiene al menos una column objeto con name =column2 . Pero después de eso no tienes control sobre qué column asociada objetos a devolver para TKBDATA_1 y JPA devolverá todos los objetos de columna asociados
    5. Si no está seguro del motivo, lea acerca de la sesión de hibernación. Cómo proporciona una presentación única de cualquier entrada asociada en la memoria. Es la base para su dirty checking y repeatable read
  • Actualice su @OneToMany de la siguiente manera

   @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();
  • Cuando se trata del lenguaje de consulta JPA, me gustaría pensar en términos de consulta de una colección de objetos en memoria.

  • Así que ahora trata de describir el significado de las siguientes dos consultas en términos de objetos.

   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
  • No olvide que, a diferencia de sql, donde selecciona cualquier columna aquí, ha dicho que desea seleccionar objetos TKBData y restringir qué objetos TKBData devolver.

  • Entonces, para lograr el mismo resultado que con su sql nativo, use la segunda consulta JPA

Nota:

A pesar de que usó una combinación izquierda en su consulta sql, es efectivamente una consulta sql de combinación interna porque también aplicó un where condición a la tabla más a la derecha en esa combinación.