Я использую Room в своем проекте Android и хочу написать сложный запрос. Я ищу об этом, и есть некоторые ответы, которые говорят, что используйте @ Embedded вот так:
class TripAndListsAndListItems {
@Embedded
var trip: Trip? = null
@Relation(parentColumn = "creatorId", entityColumn = "remoteId", entity = User::class)
var user: List<User>? = null
@Relation(parentColumn = "remoteId", entityColumn = "tripId", entity = PlanitiList::class)
var lists: List<ListAndListItems>? = null
}
Вот полная статья.
НоЗатем я должен выяснить это в своем коде, чтобы извлечь мой результат, используя циклы и так далее. Я написал свой запрос в @ Query с вложенным запросом и сопоставил столбцы с полями сущностей, используя " как ", например:
Вот ViewModel класс:
class ServiceCard(
val id: Int,
val customerInfo: String,
val time: String,
val oilFilter: Boolean,
val airFilter: Boolean,
val gasFilter: Boolean,
val oil: Boolean
)
и @ Doa имеет метод @ Query , подобный следующему:
@Dao
interface ServiceCardDao :ICommonDao<ServiceCard>{
@Query("SELECT s.services_id as id, " +
"s.user_mobile_no as customerInfo, " +
"( " +
"SELECT count(*) " +
"FROM service_detail as sd " +
"WHERE sd.services_id = s.services_id and sd.service_type_id = 1 " +
") as oilFilter, " +
"( " +
"SELECT count(*) " +
"FROM service_detail as sd " +
"WHERE sd.services_id = s.services_id and sd.service_type_id = 2 " +
") as airFilter, " +
"( " +
"SELECT count(*) " +
"FROM service_detail as sd " +
"WHERE sd.services_id = s.services_id and sd.service_type_id = 3 " +
") as gasFilter, " +
"( " +
"SELECT count(*) " +
"FROM service_detail as sd " +
"WHERE sd.services_id = s.services_id and sd.service_type_id = 4 " +
") as oil, " +
"s.service_date as time " +
"FROM services as s ")
fun selectAllServicesWithDetail(): LiveData<List<model.ServiceCard>>
}
Есть ли какое-либо преимущество илинедостаток между этими 2?