-
Significado deselect d from TKBData d JOIN d.columns c WHERE c.name = column1é
- Encontre um objeto TKBData onde ele tenha uma
columnassociada objeto para o qualnameécolumn1 - Depois de decidir qual TKBData tem pelo menos uma
columnobjeto para o qualnameécolumn1, então ele retornará todas as suascolumnassociadas 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_1comcolumn1ecolumn2associado, você também temTKBDATA_2comcolumn3associado. - Quando você executa sua consulta, ela ignora
TKBDATA_2e decide retornarTKBDATA_1pois tem pelo menos umacolumnobjeto comname=column2. Mas depois disso você não tem controle sobre qualcolumnassociada objetos a serem retornados paraTKBDATA_1e 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 checkingerepeatable read
- Encontre um objeto TKBData onde ele tenha uma
-
Atualize seu@OneToManydo 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.