使用QueryDSL进行多次连接

时间:2017-08-22 15:55:03

标签: jpa spring-data-jpa querydsl

我试图将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();

1 个答案:

答案 0 :(得分:2)

当你想要对一对多进行过滤时,你只需要连接... 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。