В настоящее время я реализую базу данных 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
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Запрос с левым соединением и комбинированными данными, разделенными запятой [дублировать]
Anonymous » » в форуме MySql - 0 Ответы
- 18 Просмотры
-
Последнее сообщение Anonymous
-