В настоящее время я реализую базу данных Room в своем приложении для Android и сталкиваюсь с неожиданным поведением при получении объектов. У меня есть объект Cv, который может иметь несколько связанных объектов Раздел. Моя цель — получить все записи резюме, даже те, которые не имеют соответствующих записей раздела.
Проблема:
Если у Cv нет связанного раздела, Room возвращает объект Cv по умолчанию, заполненный нулевыми значениями или значениями по умолчанию для его свойств. Однако при наличии связанных объектов Раздела Room правильно возвращает заполненный объект Cv. Такое поведение противоречит моим ожиданиям, поскольку я использую LEFT JOIN, которое, согласно стандартам SQL, должно возвращать все строки из таблицы Cv, даже если в таблице разделов нет соответствующих строк.
Объекты
@Entity(tableName = "cv")
data class Cv(
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id") val cvId: Int = 0,
@ColumnInfo(name = "title") val title: String?,
@ColumnInfo(name = "order_index") val orderIndex: Int,
@ColumnInfo(name = "created_at") val createdAt: Long,
)
@Entity(
tableName = "section",
foreignKeys = [ForeignKey(
entity = Cv::class,
parentColumns = ["id"],
childColumns = ["cv_id"],
onDelete = ForeignKey.CASCADE
)],
indices = [Index("cv_id")]
)
data class Section(
@PrimaryKey(autoGenerate = true) @ColumnInfo(name = "id")
val id: Int = 0, // Section ID (Primary Key)
@ColumnInfo(name = "cv_id") val cvId: Int,
@ColumnInfo(name = "order_index") val orderIndex: Int,
@ColumnInfo(name = "icon_name") val icon: CvSectionIcon,
@ColumnInfo(name = "type") val type: SectionType,
@ColumnInfo(name = "title") val title: String?,
@ColumnInfo(name = "is_active") val isActive: Boolean = true,
)
@Entity(
tableName = "form",
foreignKeys = [ForeignKey(
entity = Section::class,
parentColumns = ["id"],
childColumns = ["section_id"],
onDelete = ForeignKey.CASCADE
)],
indices = [Index("section_id")]
)
data class Form(
@PrimaryKey(autoGenerate = true) @ColumnInfo(name = "id")
val id: Int = 0,
@ColumnInfo(name = "section_id") val sectionId: Int,
@ColumnInfo(name = "order_index") val orderIndex: Int,
@ColumnInfo(name = "title") val title: String,
)
@Entity(
tableName = "field",
foreignKeys = [ForeignKey(
entity = Form::class,
parentColumns = ["id"],
childColumns = ["form_id"],
onDelete = ForeignKey.CASCADE
)],
indices = [Index("form_id")]
)
data class Field(
@PrimaryKey(autoGenerate = true) @ColumnInfo(name = "id")
val id: Int = 0,
@ColumnInfo(name = "form_id") val formId: Int,
@ColumnInfo(name = "title") val title: String,
@ColumnInfo(name = "value") val value: String,
@ColumnInfo(name = "order_index") val orderIndex: Int,
@ColumnInfo(name = "type") val type: FieldType,
@ColumnInfo(name = "tag") val tag: FieldTag,
)
POJO «Отношения»
// Cv -> Sections relationship
data class CvWithSections(
@Embedded val cv: Cv,
@Relation(
parentColumn = "id",
entityColumn = "cv_id"
)
val sections: List?
)
// Section -> Forms relationship
data class SectionWithForms(
@Embedded val section: Section?,
@Relation(
parentColumn = "id",
entityColumn = "section_id"
)
val forms: List?
)
// Form -> Fields relationship
data class FormWithFields(
@Embedded val form: Form?,
@Relation(
parentColumn = "id",
entityColumn = "form_id"
)
val fields: List?
)
// Nested relationship: Cv -> Section -> Form -> Field
data class CvWithSectionsAndFormsAndFields(
@Embedded val cv: Cv,
@Relation(
entity = Section::class,
parentColumn = "id",
entityColumn = "cv_id"
)
val sections: List?
)
data class SectionWithFormsAndFields(
@Embedded val section: Section?,
@Relation(
entity = Form::class,
parentColumn = "id",
entityColumn = "section_id"
)
val forms: List?
)
Дао
@Dao
interface CvRelationDao {
@Transaction
@Query(
"""
SELECT * FROM cv
LEFT JOIN section ON (cv.id = section.cv_id and section.type = :sectionType)
"""
)
fun getAllCvWithPersonalDetailsSectionsAndForms(
sectionType: String,
): Flow
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... -left-join
База данных комнат возвращает значение null с вложенными отношениями и левым соединением ⇐ Android
Форум для тех, кто программирует под Android
1727592701
Anonymous
В настоящее время я реализую базу данных Room в своем приложении для Android и сталкиваюсь с неожиданным поведением при получении объектов. У меня есть объект Cv, который может иметь несколько связанных объектов Раздел. Моя цель — получить все записи резюме, даже те, которые не имеют соответствующих записей раздела.
[b]Проблема:[/b]
Если у Cv нет связанного раздела, Room возвращает объект Cv по умолчанию, заполненный нулевыми значениями или значениями по умолчанию для его свойств. Однако при наличии связанных объектов Раздела Room правильно возвращает заполненный объект Cv. Такое поведение противоречит моим ожиданиям, поскольку я использую LEFT JOIN, которое, согласно стандартам SQL, должно возвращать все строки из таблицы Cv, даже если в таблице разделов нет соответствующих строк.
[b]Объекты[/b]
@Entity(tableName = "cv")
data class Cv(
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id") val cvId: Int = 0,
@ColumnInfo(name = "title") val title: String?,
@ColumnInfo(name = "order_index") val orderIndex: Int,
@ColumnInfo(name = "created_at") val createdAt: Long,
)
@Entity(
tableName = "section",
foreignKeys = [ForeignKey(
entity = Cv::class,
parentColumns = ["id"],
childColumns = ["cv_id"],
onDelete = ForeignKey.CASCADE
)],
indices = [Index("cv_id")]
)
data class Section(
@PrimaryKey(autoGenerate = true) @ColumnInfo(name = "id")
val id: Int = 0, // Section ID (Primary Key)
@ColumnInfo(name = "cv_id") val cvId: Int,
@ColumnInfo(name = "order_index") val orderIndex: Int,
@ColumnInfo(name = "icon_name") val icon: CvSectionIcon,
@ColumnInfo(name = "type") val type: SectionType,
@ColumnInfo(name = "title") val title: String?,
@ColumnInfo(name = "is_active") val isActive: Boolean = true,
)
@Entity(
tableName = "form",
foreignKeys = [ForeignKey(
entity = Section::class,
parentColumns = ["id"],
childColumns = ["section_id"],
onDelete = ForeignKey.CASCADE
)],
indices = [Index("section_id")]
)
data class Form(
@PrimaryKey(autoGenerate = true) @ColumnInfo(name = "id")
val id: Int = 0,
@ColumnInfo(name = "section_id") val sectionId: Int,
@ColumnInfo(name = "order_index") val orderIndex: Int,
@ColumnInfo(name = "title") val title: String,
)
@Entity(
tableName = "field",
foreignKeys = [ForeignKey(
entity = Form::class,
parentColumns = ["id"],
childColumns = ["form_id"],
onDelete = ForeignKey.CASCADE
)],
indices = [Index("form_id")]
)
data class Field(
@PrimaryKey(autoGenerate = true) @ColumnInfo(name = "id")
val id: Int = 0,
@ColumnInfo(name = "form_id") val formId: Int,
@ColumnInfo(name = "title") val title: String,
@ColumnInfo(name = "value") val value: String,
@ColumnInfo(name = "order_index") val orderIndex: Int,
@ColumnInfo(name = "type") val type: FieldType,
@ColumnInfo(name = "tag") val tag: FieldTag,
)
[b]POJO «Отношения»[/b]
// Cv -> Sections relationship
data class CvWithSections(
@Embedded val cv: Cv,
@Relation(
parentColumn = "id",
entityColumn = "cv_id"
)
val sections: List?
)
// Section -> Forms relationship
data class SectionWithForms(
@Embedded val section: Section?,
@Relation(
parentColumn = "id",
entityColumn = "section_id"
)
val forms: List?
)
// Form -> Fields relationship
data class FormWithFields(
@Embedded val form: Form?,
@Relation(
parentColumn = "id",
entityColumn = "form_id"
)
val fields: List?
)
// Nested relationship: Cv -> Section -> Form -> Field
data class CvWithSectionsAndFormsAndFields(
@Embedded val cv: Cv,
@Relation(
entity = Section::class,
parentColumn = "id",
entityColumn = "cv_id"
)
val sections: List?
)
data class SectionWithFormsAndFields(
@Embedded val section: Section?,
@Relation(
entity = Form::class,
parentColumn = "id",
entityColumn = "section_id"
)
val forms: List?
)
[b]Дао[/b]
@Dao
interface CvRelationDao {
@Transaction
@Query(
"""
SELECT * FROM cv
LEFT JOIN section ON (cv.id = section.cv_id and section.type = :sectionType)
"""
)
fun getAllCvWithPersonalDetailsSectionsAndForms(
sectionType: String,
): Flow
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79035720/room-database-returns-null-with-nested-realtions-and-left-join[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия