-
Significado de
select d from TKBData d JOIN d.columns c WHERE c.name = column1es- Encuentre un objeto TKBData donde tenga una
columnasociada objeto para el cualnameescolumn1 - Una vez que se decide qué TKBData tiene al menos una
columnobjeto para el cualnameescolumn1, entonces devolverá todas suscolumnasociadas 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_1concolumn1ycolumn2asociado, también tienesTKBDATA_2concolumn3asociado. - Cuando ejecute su consulta, ignorará
TKBDATA_2y decide devolverTKBDATA_1ya que tiene al menos unacolumnobjeto conname=column2. Pero después de eso no tienes control sobre quécolumnasociada objetos a devolver paraTKBDATA_1y 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 checkingyrepeatable read
- Encuentre un objeto TKBData donde tenga una
-
Actualice su
@OneToManyde 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.