Соедините 2 отношения внешнего ключа в одном объекте в запросе - PullRequest
1 голос
/ 20 апреля 2019

Учитывая

@Entity(
    tableName = "state",
    foreignKeys = arrayOf(
        ForeignKey(entity = Foo::class, parentColumns = arrayOf("id"), childColumns = arrayOf("foo_id")),
        ForeignKey(entity = Bar::class, parentColumns = arrayOf("id"), childColumns = arrayOf("bar_id"))
    )
)
data class State(
    @PrimaryKey(autoGenerate = true) val id: Long = 1
) {

    @ColumnInfo(name = "foo_id")
    var fooId: Long? = null

    @ColumnInfo(name = "bar_id")
    var barId: Long? = null

}

@Entity(tableName = "foo")
open class Foo(
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "id")
    open val id: Long,

    @ColumnInfo(name = "foo")
    val foo: String?,
)

@Entity(tableName = "bar")
open class Bar(
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "id")
    open val id: Long,

    @ColumnInfo(name = "bar")
    val bar: String?,
)

Я пытаюсь создать POJO-соединение для хранения результатов запроса:

class FooBar(
    @Embedded
    val foo: Foo,

    @Embedded
    val bar: Bar
)

И моя неудачная попытка запроса:

@Query("SELECT foo.*, bar.* FROM foo, bar JOIN state ON foo.id == state.foo_id JOIN bar ON bar.id == session.bar_id ")
fun getFooBar(): LiveData<FooBar>

Однако я получаю сообщение об ошибке при компиляции.Нужно ли мне отменять конфликт полей id в foo и bar, поскольку они названы одинаково?

Я пытался с префиксом, не повезло:

class FooBar(
    @Embedded(prefix = "foo_")
    val foo: Foo,

    @Embedded(prefix = "bar_")
    val bar: Bar
)

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 20 апреля 2019

Когда вы пытаетесь встроить, попробуйте изменить запрос следующим образом

@Dao
interface TestDao {
    @Query("SELECT foo.id as foo_id,bar.id as bar_id,bar.bar as bar_bar FROM foo, bar JOIN state ON foo_id = state.foo_id and bar_id = state.bar_id")
    fun getFooBar(): LiveData<FooBar>
}

Необходимо исправить две вещи.

  1. Вам необходимо переименоватьимя столбца во время запроса выбора.

  2. исправление вашего присоединяющегося запроса.

0 голосов
/ 20 апреля 2019

Вот пример, который может вам помочь.

@Query("SELECT RoomArticle.*, RoomBranch.id AS 'RoomBranch_id', RoomBranch.name AS 'RoomBranch_name' "

Сущность данных:

public class RoomArticleOfBranch {
    @Embedded
    public RoomArticle article;
    @Embedded(prefix = "RoomBranch_")
    public RoomBranch branch;

Примечание. Я предоставляю префикс как в запросе, так и в @Embedded.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...