You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Room带约束关联查询:获取含指定任务工时的用户

解决Android Room查询指定任务工时用户的问题

看起来你想要查询所有在指定任务(job)下有工时记录的用户,同时获取他们对应的工时信息。我来帮你梳理两种可行的方案,根据你的实际需求选择:

方案1:直接通过JOIN查询单个工时记录

如果需要获取用户在该任务下的每一条工时记录(比如用户可能多次提交同一任务的工时),可以直接用INNER JOIN关联users和times表,同时定义一个包含用户和工时信息的数据类:

第一步:定义数据类

// 假设你的Time实体包含id、userId、jobId、hours等核心字段
data class UserWithTime(
    @Embedded val user: User,
    @Embedded val time: Time
)

第二步:编写DAO查询语句

@Dao
interface UserDao {
    @Query("SELECT users.*, times.* FROM users INNER JOIN times ON times.userId = users.id WHERE times.jobId = :jobId")
    fun getUsersWithJobTime(jobId: Long): LiveData<List<UserWithTime>>
}

这里用INNER JOIN确保只返回有对应工时记录的用户,完全符合你“至少拥有某一指定任务对应工时”的要求。

方案2:查询用户在指定任务下的总工时

如果需要统计用户在该任务下的总工时(而不是每条单独记录),可以用GROUP BY和聚合函数SUM实现:

第一步:定义数据类

data class UserWithTotalJobTime(
    @Embedded val user: User,
    val totalHours: Long // 存储该用户在指定任务下的总工时
)

第二步:编写DAO查询语句

@Dao
interface UserDao {
    @Query("""
        SELECT users.*, SUM(times.hours) AS totalHours 
        FROM users 
        INNER JOIN times ON times.userId = users.id 
        WHERE times.jobId = :jobId 
        GROUP BY users.id
    """)
    fun getUsersWithTotalJobTime(jobId: Long): LiveData<List<UserWithTotalJobTime>>
}

这个查询会按用户分组,计算每个用户在指定任务下的工时总和,同时只返回有工时记录的用户。

关于你当前代码的小提示

你提到的UserWithTime用了@Embedded加@Relation的方式,这种方式更适合处理无过滤条件的一对多关联(比如获取用户的所有工时记录)。但如果要精准过滤指定任务的工时,直接用JOIN的方式会更简洁高效,不需要依赖Room的自动关联逻辑。

内容的提问来源于stack exchange,提问作者Josh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:02:29