Search code examples
androidandroid-roomandroid-room-relation

Android Room subset of values from a junction


I'm trying to extract a subset of values/columns from a junction table as follows

@Entity
class Conversation {

    @PrimaryKey
    @ColumnInfo(name = "id")
    @NonNull
    String id = UUID.randomUUID().toString();

}

@Entity
class User {

    @PrimaryKey
    @ColumnInfo(name = "id")
    int id;

    @ColumnInfo(name = "first_name")
    String firstName;

    @ColumnInfo(name = "last_name")
    String lastName;

    @ColumnInfo(name = "image")
    String image;

}

class SimpleUser {

    @ColumnInfo(name = "first_name")
    String firstName;

    @ColumnInfo(name = "last_name")
    String lastName;

}

@Entity(
    primaryKeys = {"conversation_id", "user_id"},
    foreignKeys = {
        @ForeignKey(
            entity = Conversation.class,
            parentColumns = "id",
            childColumns = "conversation_id"
        ),
        @ForeignKey(
            entity = User.class,
            parentColumns = "id",
            childColumns = "user_id"
        )
    },
    indices = {
        @Index("conversation_id"),
        @Index("user_id")
    }
)

class ConversationUser {

    @ColumnInfo(name = "conversation_id")
    @NonNull
    String conversationId = UUID.randomUUID().toString();

    @ColumnInfo(name = "user_id")
    int userId;

}

class ConversationSimpleUserList {

    @Relation(
        parentColumn = "conversation_id",
        entityColumn = "id",
        associateBy = @Junction(
            value = ConversationUser.class,
            parentColumn = "conversation_id",
            entityColumn = "user_id"
        ),
        projection = {
            "first_name", "last_name"
        }
    )
    List<SimpleUser> simpleUserList; <- I want users without all the fields I will not be using

}

However it throws the following error:

Cannot find the child entity column `id` in SimpleUser

Is this not possible to do? I couldn't find any documentation or examples showing how to do something like this.


Solution

  • Have you tried to use entity class name in Relation explicitly?

    Since Room couldn't find id field in SimpleUser class - but in base User class there is such a field:

    class ConversationSimpleUserList {
    .....
        @Relation(
            entity = User.class,  // <-- explicitly added entity
            parentColumn = "conversation_id",
            entityColumn = "id",
            associateBy = @Junction(
    .........
       
    }