Есть модель:
@Entity
public class MyModel{
@NonNull
@PrimaryKey
private int id;
private String field1;
private int foreignKey;
private String fieldTable2;
// Далее геттеры и сеттеры.
}
Поля id и field1 должны быть частью таблицы MyModel. Но, поле fieldTable2 заполняется через INNER JOIN в запросе на основании поля foreignKey.
Если оставить всё как есть, в таблице MyModel будет создано полеfieldTable2`, что приведёт к денормализации структуры данных.
Вопрос. Как сделать чтобы поле fieldTable2 осталось в классе сущности и при этом не создавалось в таблице?
Тут два варианта:
1) положить ответственность за содержимое fieldTable2 на себя, прописав над ним аннотацию @Ignore. Поле в бд не будет, но и получая из бд экземпляр MyModel это поле будет пустым
2) Надстроить объект с Relation. Примерно так:
@Entity
public class MyModel{
@NonNull
@PrimaryKey
private int id;
private String field1;
private int foreignKey;
}
public class MyModelWithField{
@Embended
public MyModel model;
@Relation(parentColumn = "foreignKey", entityColumn = "key")
public AnotherEntity field; // или public List<AnotherEntity> field; если 1 ко многим
}
Где AnotherEntity - это Entity для той таблицы, из которой выбираете по ключу данные
Теперь можно сделать вот такой запрос из DAO
@Query("select * from MyModel where *параметры*")
List<MyModelWithField> getBy(*параметры*)
По типу возвращаемого значения рум поймет, что вам нужно помимо таблицы MyModel притянуть еще и данные из другой таблицы.
Еще ремарка - нельзя использовать Relation внутри Entity. А то есть такой соблазн, по себе знаю =)
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости