-
Significado de
select d from TKBData d JOIN d.columns c WHERE c.name = column1
es- Encuentre un objeto TKBData donde tenga una
column
asociada objeto para el cualname
escolumn1
- Una vez que se decide qué TKBData tiene al menos una
column
objeto para el cualname
escolumn1
, entonces devolverá todas suscolumn
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 - Por ejemplo, tiene
TKBDATA_1
concolumn1
ycolumn2
asociado, también tienesTKBDATA_2
concolumn3
asociado. - Cuando ejecute su consulta, ignorará
TKBDATA_2
y decide devolverTKBDATA_1
ya que tiene al menos unacolumn
objeto conname
=column2
. Pero después de eso no tienes control sobre quécolumn
asociada objetos a devolver paraTKBDATA_1
y JPA devolverá todos los objetos de columna asociados - 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
yrepeatable read
- Encuentre un objeto TKBData donde tenga una
-
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
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.