java - 使用多个 ManyToOne 连接进行查询

标签 java hibernate querydsl

我有一个包含以下类的模型:

public class Organization  {

    private Person person;

}

public class PersonAddress  {

    private Person person;
    private Address address;

}

public class Address {

    ...

}

Person 和 Address、Person 和 PersonAddress、Address 和 PersonAddress 之间没有直接关联。 PersonAddress 是 Person 和 Address 之间的多对多关联,但我们试图避免映射相应的集合,因为滥用它们可能会导致一些性能问题。

我正在尝试创建一个 querydsl 方法,将组织作为参数传递,并使用组织、人员和地址数据获取预计结果,但迄今为止我最好的尝试是使用交叉联接提供查询。

我能否以避免交叉联接的方式构建此查询?并且还避免创建集合关联。

这是 querydsl 查询和生成的 SQL:

查询DSL:

QOrganization organization = QOrganization.organization;
QPerson person = QPerson.person;
QPerson personOrganization = new QPerson("personOrganization");
QAddressPerson addressPerson = QAddressPerson.addressPerson;
QAddress address = QAddress.address;
QCity city = QCity.city;
JPQLQuery<Organization> query = newQuery().from(addressPerson,organization)
    .join(organization.person, person)//
    .join(addressPerson.address, address)//
    .join(address.city, city)//
    .leftJoin(addressPerson.person, personOrganization);
    BooleanBuilder builder = new BooleanBuilder();
    builder.and(organization.eq(organizationParam));
    query.where(builder)//
        .select(create(organization.id, organization.type, //
            QPerson.create(person.id, person.type, //
            QAddressPerson.create(addressPerson.id, //
            QAddress.create(address.id, //
            QCity.create(city.id, city.name), address.zipcode)))));

生成的 SQL:

select
    organization1_.org_id as col_0_0_,
    organization1_.org_tp as col_1_0_,
    person2_.pes_id as col_4_0_,
    person2_.pes_tp as col_5_0_,
    addresspe0_.enp_id as col_10_0_,
    address3_.end_id as col_11_0_,
    city4_.cid_id as col_12_0_,
    city4_.cid_nm as col_13_0_,
    address3_.END_VR_CEP as col_15_0_
from
    address_person addresspe0_ 
inner join
    address address3_ 
        on addresspe0_.end_id=address3_.end_id 
inner join
    city city4_ 
        on address3_.cid_id=city4_.cid_id 
left outer join
    person person5_ 
        on addresspe0_.pes_id=person5_.pes_id cross 
join
    organization organization1_ 
inner join
    person person2_ 
        on organization1_.pes_id=person2_.pes_id 
where
    and organization1_.org_id=?

最佳答案

这部分导致交叉连接

newQuery().from(addressPerson,organization)

您需要将 addressPersonorganization 移动到内部联接或左联接。

关于java - 使用多个 ManyToOne 连接进行查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31125024/

相关文章:

jpa - Spring Data JPA 和 Querydsl 使用 bean/构造函数投影获取列的子集

java - NestedScrollView 中的 fragment

java - picasso 在 ListView 中向上滚动时不断重新加载图像,加载缓慢

java - MassIndexer.createIndexer() 在索引多个实体类型时卡住

java - 如何释放多个 org.hibernate.impl.SessionFactoryImpl

java - 构建maven项目时No class def found错误

java - Tomcat context.xml 文件,是否有层次结构?

java - 现在获取要在 Android 测验应用程序中显示的问题编号

spring - hibernate :无法通过 UUID 找到

mysql - 如何使用查询 DSL 连接表