如何在 Android Room 中加入同一对象的多个实例?

Yar*_*arh 5 android kotlin android-room

注意:我不能使用关系,因为我们有性能问题,这在直接连接查询中没有重现。

直到我添加target user和来自group user和对应

LEFT JOIN chat_user ON chat_user.chat_user_id = message_item.messages_target_user
LEFT JOIN chat_user ON chat_user.chat_user_id = message_item.messages_from_group_user
Run Code Online (Sandbox Code Playgroud)

它运作良好。但是添加后,我无法弄清楚如何在查询中映射这些前缀。

class ReadMessageEntity(
  @Embedded
  var message: MessageEntity,
  @Embedded
  var block: BlockEntity?,
  @Embedded
  var user: ChatUserRelationEntity,
  @Embedded(prefix = "target_user_")
  var targetUser: ChatUserEntity?,
  @Embedded(prefix = "from_group_user_")
  var fromGroupUser: ChatUserEntity?
)
Run Code Online (Sandbox Code Playgroud)

这是我试图查询的:

  @Transaction
  @Query("""
    SELECT * FROM message_item 
    LEFT JOIN block_item ON block_item.block_message_id = message_item.message_local_id
    LEFT JOIN chat_user_relation ON chat_user_relation.chat_user_id = message_item.message_user_id
    LEFT JOIN chat_user ON chat_user.chat_user_id = message_item.messages_target_user
    LEFT JOIN chat_user ON chat_user.chat_user_id = message_item.messages_from_group_user
    WHERE message_item.message_chat_id = :chatId
    ORDER BY message_created_at ASC
    """)
  fun getMessagesByChat(chatId: String): Single<List<ReadMessageEntity>>
Run Code Online (Sandbox Code Playgroud)

错误:

e: 错误:查询有问题:[SQLITE_ERROR] SQL 错误或缺少数据库(列名不明确:main.chat_user.chat_user_id)

Yar*_*arh 1

正如 Moayad .AlMoghrabi 提到的,我应该使用表别名。所以我改名LEFT JOIN chat_userLEFT JOIN chat_user target_user. 请注意,chat-user 和 target_user 之间没有 AS。(我的错误是我试图把它放在那里)。前缀的行为对我来说仍然是一个谜,因为 chat_user 的前缀可以正常工作,但是如果我将前缀添加到 ChatUserRelationEntity 中,那么我会收到未知的列错误。

SELECT * FROM message_item 
LEFT JOIN block_item
    ON block_item.block_message_id = message_item.message_local_id
LEFT JOIN chat_user_relation 
    ON chat_user_relation.chat_user_relation_chat_user_id = message_item.message_user_id
    AND chat_user_relation.chat_user_relation_chat_user_chat_id = :chatId
LEFT JOIN chat_user target_user 
    ON target_user.chat_user_id = message_item.messages_target_user
LEFT JOIN chat_user from_group_user 
    ON from_group_user.chat_user_id = message_item.messages_from_group_user
WHERE message_item.message_chat_id = :chatId
ORDER BY message_created_at ASC
Run Code Online (Sandbox Code Playgroud)