Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot JPA如何在多个关系中给定一个对象来查询@OneToMany关系_Spring_Spring Boot_Spring Data Jpa_Spring Data - Fatal编程技术网

Spring boot JPA如何在多个关系中给定一个对象来查询@OneToMany关系

Spring boot JPA如何在多个关系中给定一个对象来查询@OneToMany关系,spring,spring-boot,spring-data-jpa,spring-data,Spring,Spring Boot,Spring Data Jpa,Spring Data,我看到了一些相关的问题,但我似乎找不到正确的答案。 我有两个表格作业和工人,一个作业可以有很多工人,简化实体 @Entity @Table(name = "jobs") data class Job( @Id @Type(type = "pg-uuid") val id: UUID = UUID.randomUUID() ) { @ManyToOne var office: Office? = null @

我看到了一些相关的问题,但我似乎找不到正确的答案。 我有两个表格作业和工人,一个作业可以有很多工人,简化实体

@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()
}
由一名工人输入。我也尝试过查询worker的UUID,因为这是join表中的内容

JPA创建一个包含两个外键的联接表,该表是

jobs_requests
和列

job_id UUID
requests_id UUID

您提到一个工作可以有许多工人,并且您还提到您希望获得特定工人的工作列表。所以这听起来像是一种多人的关系,而不是一个女人的关系

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

以下是多人关系的设置,希望能有所帮助:

@实体
@表(name=“jobs”)
数据类作业(
@许多
@得到:很多
@get:可连接(
name=“worker\u job”,
joinColumns=[JoinColumn(name=“job_id”)],
inverseJoinColumns=[JoinColumn(name=“worker\u id”)]
)
val worker:Set=HashSet()
)
@实体
@表(name=“worker”)
数据类工作者(
@许多
@得到:很多
@get:可连接(
name=“worker\u job”,
joinColumns=[JoinColumn(name=“worker\u id”)],
inverseJoinColumns=[JoinColumn(name=“job\u id”)]
)
val作业:Set=HashSet()
)

您提到一个工作可以有许多工人,并且您还提到您希望获得特定工人的工作列表。所以这听起来像是一种多人的关系,而不是一个女人的关系

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

以下是多人关系的设置,希望能有所帮助:

@实体
@表(name=“jobs”)
数据类作业(
@许多
@得到:很多
@get:可连接(
name=“worker\u job”,
joinColumns=[JoinColumn(name=“job_id”)],
inverseJoinColumns=[JoinColumn(name=“worker\u id”)]
)
val worker:Set=HashSet()
)
@实体
@表(name=“worker”)
数据类工作者(
@许多
@得到:很多
@get:可连接(
name=“worker\u job”,
joinColumns=[JoinColumn(name=“worker\u id”)],
inverseJoinColumns=[JoinColumn(name=“job\u id”)]
)
val作业:Set=HashSet()
)

同样值得注意的是,对于所有实际用途,您应该尽量避免显式的多个注释。您应该创建一个新的实体/表,该实体/表将包含Job和Worker的字段,这两个字段都与各自的实体有许多关联

您应该避免显式多工的原因是,比如说有一个特定的工作,例如JavaDev,并且给定的工作上有1000名工人。在某一点上,您有一个JavaDev实体,您希望得到所有年龄在20到25岁之间的员工。为此,需要迭代Workers列表,该列表是JavaDev实体的一部分,并将其过滤掉。发生这种情况时,有两种情况:

  • Workers列表是一个惰性关联,当您尝试访问它时,hibernate将向数据库发送1000个(n+1个问题)查询
  • Workers列表是一个急切的关联,hibernate将向数据库发送相同数量的查询,但只要您尝试获取JavaDev实体
  • 因此,执行时间会增加,因为数据库本身会有不必要的负载量。在更大的项目上,这将变得更加复杂


    如果您创建自己的manytomy(例如job_workers)表,并附带存储库和服务,则可以避免所有这些问题,这样您就可以更高效地查询数据。

    值得注意的是,对于所有实际用途,您应该尽量避免显式的manytomy注释。您应该创建一个新的实体/表,该实体/表将包含Job和Worker的字段,这两个字段都与各自的实体有许多关联

    您应该避免显式多工的原因是,比如说有一个特定的工作,例如JavaDev,并且给定的工作上有1000名工人。在某一点上,您有一个JavaDev实体,您希望得到所有年龄在20到25岁之间的员工。为此,需要迭代Workers列表,该列表是JavaDev实体的一部分,并将其过滤掉。发生这种情况时,有两种情况:

  • Workers列表是一个惰性关联,当您尝试访问它时,hibernate将向数据库发送1000个(n+1个问题)查询
  • Workers列表是一个急切的关联,hibernate将向数据库发送相同数量的查询,但只要您尝试获取JavaDev实体
  • 因此,执行时间会增加,因为数据库本身会有不必要的负载量。在更大的项目上,这将变得更加复杂


    如果您创建自己的manytomany(例如job_workers)表,以及附带的存储库和服务,那么所有这些都可以避免,从中您可以更高效地查询数据。

    您可以向我们展示您的实体及其关系的数据库映射吗?您的数据库脚本呢?
    jobs_requests
    
    job_id UUID
    requests_id UUID