【问题标题】:Java Jpa - How to perform a query with jpa with repeated dataJava Jpa - 如何使用带有重复数据的 jpa 执行查询
【发布时间】:2020-11-06 13:41:12
【问题描述】:

我需要在两个相关表之间形成一个查询,以获取所有不相关的记录和那些也相关的记录。

Person 表有 @OneToMany 和 company 表。

该人的每条记录,可能与许多公司关联,也可能不关联,例如,在人员表中,一条记录在公司表中有五个关联记录,我需要通过为其分配重复五次来获取此记录公司表中的数据。 我遇到的问题是我只获得了一个人的记录,而该人的@OneToMany List 具有与之关联的其他记录。

如示例中所示,我想获取该人的 5 条重复记录,每条记录与不同的公司相关联,以及与任何公司无关的人员

Person              Company     
ID  Name            ID      Name         TableAID
1   Name one        1   Name tableB1        1
2   Name two        2   Name tableB2        1
3   Name three      3   Name tableB3        1
4   Name four       4   Name tableB4        2
5   Name five       5   Name tableB5        3

List personList = "从 Person 中选择人员 ...."

       ID

Person_1 : id-1 姓名一/公司 (1)
Person_1 : id-1 姓名一/公司 (2)
Person_1 : id-1 姓名一/公司 (3)
Person_2 : id-2 姓名二/公司 (4)
Person_3 : id-3 姓名三 / 公司 (5)
Person_4 : id-4 姓名四/ 公司 (null)
Person_5 : id-5 姓名五/公司(空)

我的解决方案:
我不得不收集对象列表并手动解析我需要的值,而不是像这样收集实体。

之前: 列出 personList = query.getResultList();

之后: List personList = query.getResultList();

每个数组都是我从查询中返回的值,例如:

Select person, company from Person person left join Company company on 
company.person = person.company


Object[] objectOne = [person, company];
Object[] objectTwo = [person, company];

对于数组的每个值我都投射了相同的实体,例如:

Person person = (Person) objectOne[0];
Company company = (Company) objectOne[1];

【问题讨论】:

  • 我不知道。当 JPA 及其 @OneToMany 关系正是为这种情况而发明的时,为什么要强制您的数据库向您发送冗余数据。只需查询人员。然后每个 person.getCompanies() 都会懒惰地查询这些公司。会产生更多查询,但流量会更少。
  • 我需要这样做,因为我要像这样在 html 表格中显示它,我需要对结果进行分页。如果我只从person表中获取所有记录,分页没有正确完成,一些记录会丢失,不会显示在html表中

标签: java sql jpa


【解决方案1】:

您尚未展示如何映射 Person 和 Company 实体或它们的关系,但对于每一种关系,都有相反的一面。尝试将其视为公司查询,而不是人员查询。

"Select person, company From Company company join company.people where ..."

这将返回一个 List,其中每一行都表示为一个对象数组,其中位置 0 是人员,位置 1 是公司。

如果您只映射了人-> 公司关系,则​​情况相反:

"Select person, company From Person person join person.companies company where ..."

【讨论】:

  • 感谢您的评论。我更新了问题,我找到了一个可能的解决方案,它对我有用。
猜你喜欢
  • 1970-01-01
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-29
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多