首页 > 解决方案 > Spring boot JPA如何查询@OneToMany关系给定一个对象的多关系

问题描述

我已经看到了一些相关的问题,但我似乎无法为我正在尝试做的事情找到正确的答案。我有两张表 Jobs 和 Workers,一个job 可以有很多workers,简化实体

@Entity
@Table(name = "jobs")
data class Job(
    @Id
    @Type(type = "pg-uuid")
    val id: UUID = UUID.randomUUID()
) {
    @ManyToOne
    var office: Office? = null

    @OneToMany(targetEntity = Worker::class)
    var requests: MutableList<Worker> = mutableListOf()
}

我希望能够获取特定工作人员的工作列表

我已经尝试了一些本地查询而不是本地查询,但是现在尝试通过 namedMethods 来完成它,老实说,我想这里的任何工作似乎都应该在我的工作回购中工作

@Repository
interface JobsRepo : CrudRepository<Job, UUID> {

    @Query("SELECT j FROM Job j WHERE id = ?1")
    fun findJobById(id: UUID): Job?

    @Query("SELECT j FROM Job j WHERE office_id = ?1")
    fun findJobsByOffice(id: UUID): List<Job>?

    @Modifying
    @Transactional
    @Query("UPDATE jobs SET job_status = 4 WHERE job_status = 1 AND start_time < ?1", nativeQuery = true)
    fun expireJobs(date: Date)

    fun findByRequests_Worker(worker: Worker): List<Job>?

}

我不太确定如何查询数组属性

requests

在一名工人的投入下。我也尝试查询工作人员的 UUID,因为那是连接表中的内容

JPA 使用该表的两个外键创建一个连接表

jobs_requests

和列

job_id UUID
requests_id UUID

标签: springspring-bootspring-data-jpaspring-data

解决方案


您提到一个 Job 可以有许多工人,并且您还提到您想要获取特定工人的工作列表。所以这听起来像是多对多关系而不是单对多关系。

对于多对多关系,连接表是不可避免的。您需要在两个实体上指定 @ManyToMany 注释,然后您可以使用 WorkerRepository 查询工作人员,然后获取该工作人员的工作列表,您只需通过 worker.getJobs() 访问即可。

以下是ManyToMany关系的设置,希望对您有所帮助:

@Entity
@Table(name = "jobs")
data class Job (
    @ManyToMany
    @get:ManyToMany
    @get:JoinTable(
            name = "worker_job",
            joinColumns = [JoinColumn(name = "job_id")],
            inverseJoinColumns = [JoinColumn(name = "worker_id")]
    )
    val worker: Set<Worker> = HashSet()

)
@Entity
@Table(name = "worker")
data class Worker (
    @ManyToMany
    @get:ManyToMany
    @get:JoinTable(
            name = "worker_job",
            joinColumns = [JoinColumn(name = "worker_id")],
            inverseJoinColumns = [JoinColumn(name = "job_id")]
    )
     val jobs: Set<Jobs> = HashSet()
)

推荐阅读