【问题标题】:Multiple Joins with QueryDSLQueryDSL 的多重连接
【发布时间】:2018-01-31 00:16:21
【问题描述】:

我正在尝试将 QueryDSL 与 Spring Data JPA 一起使用。

我的数据库有 3 个表。

1) 包含帐户信息和具体帐号的帐户表。 2) 一个 PersonRole 表,其中包含一个人在帐户中的角色(如所有者)以及相应的帐号和他的个人 ID 号。 3) 有一行人的人表。他们的身份证号码和名字,姓氏等......

我的实体如下所示:

@Entity
Account{
//...Other fields ommited
// **
@OneToMany
@JoinColumn(name = "ACCNT_NUMBER")
List<PersonRole> personRoles;**
}

@Entity
PersonRole{
String role;
// ...Other fields ommited
// **
@OneToOne
@JoinColumn(name = "PERSON_ID")
Person person;**
}


@Entity
Person{...}

我想按人员的名字和姓氏过滤我选择的帐户,然后使用它来填充具有关联人员角色和人员的合同实体。

我假设我必须创建连接才能做到这一点。我尝试了很多东西,但我不断收到错误。我已经创建了相应的 QClasses。我知道下面的代码是错误的并且它不起作用但也许你可以看看我是否在正确的轨道上并可能帮助我。任何帮助是极大的赞赏。谢谢!

    QAccount account = QAccount.account;
    QPersonRole personRoles = QPersonRole.personRole;
    QPerson person = QPerson.person;

    JPAQuery<Account> query = new JPAQuery<>(entityManager);

    List<Account> accountList = query
            .from(account)
            .innerJoin(acccount.personRoles, personRoles)
            .innerJoin(person)
            .where(person.lastName.eq("John")
                    .and(person.lastName.eq("Doe")))
            .fetch();

【问题讨论】:

  • contracts 是什么意思?问题中没有contract 的代码。另外,为什么从PersonRolePerson 之间存在@OneToOne 关联?据推测,单个Person 可以在多个Accounts 中发挥作用,这意味着多个PersonRole 记录,每个Account 记录一个,其中Person 有一个角色。因此,应该有一个从PersonRolePerson@ManyToOne 关联。如果没有,为什么不将角色名称和帐户引用与Person 本身一起存储?
  • 对不起,我的意思是帐户而不是合同。我编辑了。因此,帐户和人员之间确实存在多对多关系,因此为了解决我们使用连接表的问题。虽然一个人可以在一份合同和不同的合同中担任多个角色,但我认为通过使其成为一个人,可以为合同中的每个角色分配一个人。我应该将其更改为 onetomany 吗?

标签: jpa spring-data-jpa querydsl


【解决方案1】:

当您想过滤一对多时,您只需要加入... jpql 仍然可以利用...而且我更喜欢在 personRole 上使用单数:

QAccount account = QAccount.account;
QPersonRole personRole = QPersonRole.personRole;

JPAQuery<Account> query = new JPAQuery<>(entityManager);

List<Account> accountList = query
            .from(account)
            .innerJoin(acccount.personRoles, personRole)
            .where(personRole.person.lastName.eq("John")
                    .and(personRole.person.lastName.eq("Doe")))
            .fetch();

注意加入 Person 是不必要的。

【讨论】:

  • 你先生是个英雄。谢谢你的帮助!现在我只需要将它们与 BooleanBuilder 结合在一起,我还想使用 Spring Data Pagination。如果您对连接这些点有任何建议,我很乐意听到:)
  • 当您在查询 dsl 中进行连接时,您将无法使用 spring 数据的分页。限制和抵消是你的朋友。如果您能弄清楚如何在连接中使用 spring 数据,请告诉我
  • 在上面的 where 子句中,lastName 被使用了两次是不是有错字?
猜你喜欢
  • 2018-05-21
  • 2023-04-01
  • 1970-01-01
  • 2013-02-05
  • 1970-01-01
  • 2014-10-10
  • 2021-08-27
  • 2013-05-11
  • 2016-08-03
相关资源
最近更新 更多