如何在使用 ROOM 的连接中 select 两列同名?
How can I select two columns with the same name in a Join using ROOM?
我正在制作一个 Android 应用程序,它使用空间来创建和管理数据库,我需要在两个具有相同名称列的表之间进行连接(两个表中的主键是称为 "id")。我使用 POJO 来保存返回的元组,但它只能保存一个 ID(我需要两个 ID,但只返回 Toma.id)。
我的加入查询:
@Query("SELECT Toma.id, statusToma, horaToma, nombreMedicamento, tipo, titulo, color, Tratamiento.id FROM TOMA JOIN Tratamiento ON Tratamiento.id = Toma.tratamientoID JOIN Medicamento ON Tratamiento.medicamentoID = Medicamento.id WHERE Tratamiento.usuarioID = :id")
fun getTomasDia(id: Int?) : LiveData<List<JoinTomasDelDia>>
我的 POJO:
data class JoinTomasDelDia(
@ColumnInfo(name = "id") val id: Int?,
@ColumnInfo(name = "horaToma") val horaToma: String?,
@ColumnInfo(name = "statusToma") var statusToma: Int?,
@ColumnInfo(name = "nombreMedicamento") val medicamento: String?,
@ColumnInfo(name = "tipo") val tipo: String?,
@ColumnInfo(name = "titulo") val tituloTratamiento: String?,
@ColumnInfo(name = "color") val color: Int?,
@ColumnInfo(name = "Tratamiento.id") val idTratamiento: Int?
)
我试过在查询中使用 Toma.id 和 Tratamiento.id,也在 @ColumnInfo 名称中为两个 id 使用,但只返回 Toma.id,Tratamiento.id 是返回空值。
我的实体:
@Entity(foreignKeys = arrayOf(
ForeignKey(entity = Tratamiento::class,
parentColumns = arrayOf("id"),
childColumns = arrayOf("tratamientoID"),
onDelete = ForeignKey.CASCADE
)
))
class Toma(@PrimaryKey(autoGenerate = true) var id: Int,
var statusToma : Int = 0,
var horaToma: String? = null,
var tratamientoID: Int? = null
)
@Entity(foreignKeys = arrayOf(
ForeignKey(entity = Medicamento::class,
parentColumns = arrayOf("id"),
childColumns = arrayOf("medicamentoID"),
onDelete = ForeignKey.CASCADE),
ForeignKey(entity = Usuario::class,
parentColumns = arrayOf("uid"),
childColumns = arrayOf("usuarioID"),
onDelete = ForeignKey.CASCADE
)
))
class Tratamiento (@PrimaryKey(autoGenerate = true) var id: Int,
var titulo: String? = null,
var usuarioID: Int? = null,
var medicamentoID: Int? = null,
var indicaciones: String? = null,
var fechaInicio: String? = null,
var fechaFin: String? = null,
var diasTratamiento: Int = 0,
var status: Int? = null,
var recordatorio: Int? = null,
var atiempo: Int? = null,
var pospuestas: Int? = null,
var omitidas: Int? = null)
@Entity(foreignKeys = arrayOf(ForeignKey(entity = Usuario::class,
parentColumns = arrayOf("uid"),
childColumns = arrayOf("usuarioID"),
onDelete = ForeignKey.CASCADE)))
data class Medicamento (@PrimaryKey(autoGenerate = true) var id: Int,
var nombreMedicamento: String? = null,
var nombreGenerico: String? = null,
var dosis: String? = null,
var nota: String? = null,
var tipo: String? = null,
var color: Int? = null,
var fotografia: String? = null,
var usuarioID : Int? = null)
我使用 DB Broser for SQLite 进行了连接并且工作正常:
SELECT Toma.id, statusToma, horaToma, nombreMedicamento, tipo, titulo, color, Tratamiento.id FROM TOMA JOIN Tratamiento ON Tratamiento.id = Toma.tratamientoID JOIN Medicamento ON Tratamiento.medicamentoID = Medicamento.id WHERE Tratamiento.usuarioID = 1
如何使用 Room 在 Android 中解决这个问题?
也许,试试这个。更新您的查询以将两个 ID 作为不同的别名包含在内。
@Query("SELECT Toma.id as tomaId, statusToma, horaToma, nombreMedicamento, tipo, titulo, color, Tratamiento.id as trataminetoId FROM TOMA JOIN Tratamiento ON Tratamiento.id = Toma.tratamientoID JOIN Medicamento ON Tratamiento.medicamentoID = Medicamento.id WHERE Tratamiento.usuarioID = :id")
fun getTomasDia(id: Int?) : LiveData<List<JoinTomasDelDia>>
并更新您的实体以同时拥有这两个 ID。
data class JoinTomasDelDia(
@ColumnInfo(name = "tomaId") val id: Int?,
@ColumnInfo(name = "trataminetoId") val id2: Int?,
@ColumnInfo(name = "horaToma") val horaToma: String?,
@ColumnInfo(name = "statusToma") var statusToma: Int?,
@ColumnInfo(name = "nombreMedicamento") val medicamento: String?,
@ColumnInfo(name = "tipo") val tipo: String?,
@ColumnInfo(name = "titulo") val tituloTratamiento: String?,
@ColumnInfo(name = "color") val color: Int?,
@ColumnInfo(name = "Tratamiento.id") val idTratamiento: Int?
)
我正在制作一个 Android 应用程序,它使用空间来创建和管理数据库,我需要在两个具有相同名称列的表之间进行连接(两个表中的主键是称为 "id")。我使用 POJO 来保存返回的元组,但它只能保存一个 ID(我需要两个 ID,但只返回 Toma.id)。
我的加入查询:
@Query("SELECT Toma.id, statusToma, horaToma, nombreMedicamento, tipo, titulo, color, Tratamiento.id FROM TOMA JOIN Tratamiento ON Tratamiento.id = Toma.tratamientoID JOIN Medicamento ON Tratamiento.medicamentoID = Medicamento.id WHERE Tratamiento.usuarioID = :id")
fun getTomasDia(id: Int?) : LiveData<List<JoinTomasDelDia>>
我的 POJO:
data class JoinTomasDelDia(
@ColumnInfo(name = "id") val id: Int?,
@ColumnInfo(name = "horaToma") val horaToma: String?,
@ColumnInfo(name = "statusToma") var statusToma: Int?,
@ColumnInfo(name = "nombreMedicamento") val medicamento: String?,
@ColumnInfo(name = "tipo") val tipo: String?,
@ColumnInfo(name = "titulo") val tituloTratamiento: String?,
@ColumnInfo(name = "color") val color: Int?,
@ColumnInfo(name = "Tratamiento.id") val idTratamiento: Int?
)
我试过在查询中使用 Toma.id 和 Tratamiento.id,也在 @ColumnInfo 名称中为两个 id 使用,但只返回 Toma.id,Tratamiento.id 是返回空值。
我的实体:
@Entity(foreignKeys = arrayOf(
ForeignKey(entity = Tratamiento::class,
parentColumns = arrayOf("id"),
childColumns = arrayOf("tratamientoID"),
onDelete = ForeignKey.CASCADE
)
))
class Toma(@PrimaryKey(autoGenerate = true) var id: Int,
var statusToma : Int = 0,
var horaToma: String? = null,
var tratamientoID: Int? = null
)
@Entity(foreignKeys = arrayOf(
ForeignKey(entity = Medicamento::class,
parentColumns = arrayOf("id"),
childColumns = arrayOf("medicamentoID"),
onDelete = ForeignKey.CASCADE),
ForeignKey(entity = Usuario::class,
parentColumns = arrayOf("uid"),
childColumns = arrayOf("usuarioID"),
onDelete = ForeignKey.CASCADE
)
))
class Tratamiento (@PrimaryKey(autoGenerate = true) var id: Int,
var titulo: String? = null,
var usuarioID: Int? = null,
var medicamentoID: Int? = null,
var indicaciones: String? = null,
var fechaInicio: String? = null,
var fechaFin: String? = null,
var diasTratamiento: Int = 0,
var status: Int? = null,
var recordatorio: Int? = null,
var atiempo: Int? = null,
var pospuestas: Int? = null,
var omitidas: Int? = null)
@Entity(foreignKeys = arrayOf(ForeignKey(entity = Usuario::class,
parentColumns = arrayOf("uid"),
childColumns = arrayOf("usuarioID"),
onDelete = ForeignKey.CASCADE)))
data class Medicamento (@PrimaryKey(autoGenerate = true) var id: Int,
var nombreMedicamento: String? = null,
var nombreGenerico: String? = null,
var dosis: String? = null,
var nota: String? = null,
var tipo: String? = null,
var color: Int? = null,
var fotografia: String? = null,
var usuarioID : Int? = null)
我使用 DB Broser for SQLite 进行了连接并且工作正常:
SELECT Toma.id, statusToma, horaToma, nombreMedicamento, tipo, titulo, color, Tratamiento.id FROM TOMA JOIN Tratamiento ON Tratamiento.id = Toma.tratamientoID JOIN Medicamento ON Tratamiento.medicamentoID = Medicamento.id WHERE Tratamiento.usuarioID = 1
如何使用 Room 在 Android 中解决这个问题?
也许,试试这个。更新您的查询以将两个 ID 作为不同的别名包含在内。
@Query("SELECT Toma.id as tomaId, statusToma, horaToma, nombreMedicamento, tipo, titulo, color, Tratamiento.id as trataminetoId FROM TOMA JOIN Tratamiento ON Tratamiento.id = Toma.tratamientoID JOIN Medicamento ON Tratamiento.medicamentoID = Medicamento.id WHERE Tratamiento.usuarioID = :id")
fun getTomasDia(id: Int?) : LiveData<List<JoinTomasDelDia>>
并更新您的实体以同时拥有这两个 ID。
data class JoinTomasDelDia(
@ColumnInfo(name = "tomaId") val id: Int?,
@ColumnInfo(name = "trataminetoId") val id2: Int?,
@ColumnInfo(name = "horaToma") val horaToma: String?,
@ColumnInfo(name = "statusToma") var statusToma: Int?,
@ColumnInfo(name = "nombreMedicamento") val medicamento: String?,
@ColumnInfo(name = "tipo") val tipo: String?,
@ColumnInfo(name = "titulo") val tituloTratamiento: String?,
@ColumnInfo(name = "color") val color: Int?,
@ColumnInfo(name = "Tratamiento.id") val idTratamiento: Int?
)