o produto2 de id 13 não tem a variacao3 e esse Select retorna : cor,tamanho, tecido e na verdade só deveria retornar: Cor, Tamanho.
select distinct g from Grade g, ProdutoVariacao p, Variacao v
where (p.variacao1_id = v.id or p.variacao2_id = v.id or p.variacao3_id = v.id) and p.produto_id = 13
Produto1 tem as Variacoes :
verde, p, algodao
Produto2 tem variaçoes:
verde, p
No produto 2 de id 13 no meu exemplo nao tem TECIDO. tem apenas variação VERDE e P que são das Grades: COR e TAMANHO. Sendo assim o select só deveria retornar as grades: Cor e Tamanho.
Se bem entendi o que pretendes, falta-te uma condição no where para relacionar grade e variacao.
select distinct g
from Grade g, ProdutoVariacao p, Variacao v
where (p.variacao1_id = v.id or p.variacao2_id = v.id or p.variacao3_id = v.id)
and v.grade_id = g.id
and p.produto_id = 13