1
resposta

Como relacionar tabelas/entidades de modo a não ter tabelas com colunas duplicadas

@Entity class Transacao( @PrimaryKey(autoGenerate = true) val id: Long = 0, val valor: BigDecimal = BigDecimal.ZERO, @ForeignKey( entity = Categoria::class, parentColumns = ["id"], childColumns = ["categoriaId"], onUpdate = CASCADE, onDelete = CASCADE ) val categoriaId: Long = 0, val tipo: Tipo, val data: Calendar = Calendar.getInstance() //val nomeCategoria:String? = null (não deve haver na tabela essa coluna) )

@Entity class Categoria (@PrimaryKey(autoGenerate = true) val id: Long = 0, val nome: String, val tipo: Tipo)

. . . @Query("SELECT t.*, c.nome AS nomeCategoria FROM transacao t JOIN categoria c ON t.categoriaId = c.id") fun pegaTudo(): MutableList . . .

A questão é: a entidade Transacao deve ter uma propriedade nomeCategoria:String que vai conter o valor da propriedade "nome" da entidade Categoria cuja propriedade "categoriaId" da entidade Transacao representa, mas essa propriedade "nomeCategoria" não deve refletir na construção da tabela "categoria". A tabela "transacao" deve ter todas as propriedades da sua entidade mas não uma coluna "nomeCategoria", entretanto o objeto/entidade Transacao deve ter essa propriedade "nomeCategoria", mas essa só será preenchida quando a função pegaTudo() for usada. Para todas as outras chamadas essa propriedade deve vir nula. O objetivo é evitar fazer múltiplas chamadas ao banco quando precisar montar uma lista de "transação" e evitar colunas em duplicidade no banco. Como posso fazer isso?

1 resposta

Oi Rogério, tudo bem?

Para esses casos criamos uma tabela intermediária, como por exemplo, a TransacaoComCategoria:

class TransacaoComCategoria(
    @Embedded transacao: Transacao, 
    nomeCategoria: String)

Então na busca você realiza o seu join indicando que vai devolver uma transação e a coluna que corresponde o nome da categoria, algo como "SELECT t*, c.nome as 'nomeCategoria FROM ..."

Lembre-se de devolver a referência nova na query (TransacaoComCategoria)

O @Embedded é necessário devido a falta de suporte de relacionamento entre entidades, dessa forma ele pega todos os campos e converte para as vincula com cada uma das colunas.

[]s

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software