-
Significado deselect d from TKBData d JOIN d.columns c WHERE c.name = column1
é
- Encontre um objeto TKBData onde ele tenha uma
column
associada objeto para o qualname
écolumn1
- Depois de decidir qual TKBData tem pelo menos uma
column
objeto para o qualname
écolumn1
, então ele retornará todas as suascolumn
associadas objetos sobre o qual você não tem controle no JPA. (consulte Minha resposta para outra pergunta ). Alternativa é escrever sql nativo e retornar objetos não-entidade personalizados - Por exemplo, você tem
TKBDATA_1
comcolumn1
ecolumn2
associado, você também temTKBDATA_2
comcolumn3
associado. - Quando você executa sua consulta, ela ignora
TKBDATA_2
e decide retornarTKBDATA_1
pois tem pelo menos umacolumn
objeto comname
=column2
. Mas depois disso você não tem controle sobre qualcolumn
associada objetos a serem retornados paraTKBDATA_1
e o JPA retornará todos os objetos de coluna associados - Se você não tiver certeza do motivo, leia sobre a sessão de hibernação. Como ela fornece uma apresentação exclusiva de qualquer entrada associada na memória. É a base para sua
dirty checking
erepeatable read
- Encontre um objeto TKBData onde ele tenha uma
-
Atualize seu@OneToMany
do seguinte modo
@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();
-
Quando se trata de linguagem de consulta JPA, gostaria de pensar em termos de consulta a uma coleção de objetos na memória.
-
Então agora tente descrever o significado das duas consultas a seguir em termos 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
-
Não se esqueça, ao contrário do sql, onde você está selecionando quaisquer colunas aqui que você disse que deseja selecionar objetos TKBData e restringindo quais objetos TKBData retornar.
-
Portanto, para obter o mesmo resultado do seu sql nativo, use a segunda consulta JPA
Observação:
Mesmo que você tenha usado uma junção esquerda em sua consulta sql, é efetivamente uma consulta sql de junção interna porque você também aplicou um
where
condição para a tabela mais à direita nessa junção.