es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Deconflicte los nombres de columna en la entidad “join”.

Tengo 2 entidades:

@Entity(tableName = "author")
data class Author(
   @PrimaryKey
   @ColumnInfo(name = "id")
   val id: String,

   @ColumnInfo(name = "name")
   val name: String
)

data class Book(
   @ColumnInfo(name = "id")
   val id: String,

   @ColumnInfo(name = "title")
   val title: String,

   @ColumnInfo(name = "author_id")
   var authorId: String
)

Y me gustaría unirlos en una consulta:

@Query("SELECT * FROM book JOIN author ON author.id = book.author_id AND author.id = :authorId WHERE book.id = :bookId")
fun item(authorId: String, bookId: String): LiveData<bookwithauthor>

En esta entidad:

@Entity
data class BookWithAuthor(
        @Relation(parentColumn = "author_id", entityColumn = "id")
        val author: Author,

        @Embedded
        val book: Book
)

Sin embargo, cuando hago esto, obtengo un objeto BookWithAuthor en el que el author.id y book.id son el mismo id, en este caso ambos son el id del autor. ¿Cómo puedo solucionar el conflicto del atributo “id” en las entidades en el objeto “join”?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para solucionar el conflicto de propiedad “id” en las entidades del objeto “join”, puedes usar la anotación @ColumnInfo para diferenciar entre las columnas “id” de las entidades Author y Book. Por ejemplo, puedes renombrar la columna “id” en la entidad Book como “book_id” de la siguiente manera:

    @Entity(tableName = "author")
    data class Author(
       @PrimaryKey
       @ColumnInfo(name = "id")
       val id: String,
    
       @ColumnInfo(name = "name")
       val name: String
    )
    
    @Entity(tableName = "book")
    data class Book(
       @PrimaryKey
       @ColumnInfo(name = "book_id")
       val id: String,
    
       @ColumnInfo(name = "title")
       val title: String,
    
       @ColumnInfo(name = "author_id")
       var authorId: String
    )
    
    

    Luego, en la entidad BookWithAuthor, puedes utilizar los nuevos nombres de columna en las anotaciones @Relation y @Embedded:

    @Entity
    data class BookWithAuthor(
            @Relation(parentColumn = "author_id", entityColumn = "id")
            val author: Author,
    
            @Embedded(prefix = "book_")
            val book: Book
    )
    

    Aquí, el parámetro de prefijo en la anotación @Embedded se utiliza para diferenciar entre las columnas de la entidad Book y la entidad Author con el mismo nombre.

Comments are closed.