标准生成器多重连接

问题描述 投票:0回答:1

我有 4 个不同的表,在这些表上应用了连接,这在 SQL 查询中工作得很好

    SELECT donor.title, SUM(donation.donated_amount) + SUM(donation.gift_aid),    
    SUM(donation.donated_amount)
    FROM checkout checkout
    JOIN donation donation ON donation.checkout_id = checkout.id
    JOIN donor donor ON checkout.donor_id = donor.donor_id
    JOIN company company ON company.id = donor.company_id
    WHERE donation.donation_status = 1
    GROUP BY donor.title;

现在我必须在结果集上实现过滤器,所以我实现了这个 Criteria Builder Stuff。

    CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
    CriteriaQuery<DonorReportResponseDTO> criteriaQuery = criteriaBuilder.createQuery(DonorReportResponseDTO.class);
    Root<Checkout> checkout = criteriaQuery.from(Checkout.class);
    Join<Checkout, Donation> donation = checkout.join(Checkout_.donation);
    Join<Checkout, Donor> donor = checkout.join(Checkout_.donor);
    Join<Donor, Company> company = donor.join(Donor_.company);

但是这在第一个 Join 语句上给出了这个错误。

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause java.lang.NullPointerException: null at org.hibernate.query.criteria.internal.path.AbstractFromImpl.constructJoin(AbstractFromImpl.java:293)
at org.hibernate.query.criteria.internal.path.AbstractFromImpl.join(AbstractFromImpl.java:279)
at com.netsol.fareshare.auth.repository.DonationRepositoryImpl.getDonorDetailReportByCriteria(DonationRepositoryImpl.java:35)
at com.netsol.fareshare.auth.repository.DonationRepositoryImpl$$FastClassBySpringCGLIB$$32b471a5.invoke(<generated>)
spring-boot criteria-api criteriaquery criteriabuilder
1个回答
0
投票

在当前场景中,Join 语句未选择元模型

Join<Checkout, Donation> donation = checkout.join(Checkout_.donation);

所以我将 Metamodel 类实例更改为我在 Campaign Entity 中指定的变量,如下所示

Join<Checkout, Donation> donation = checkout.join("donation");

并在所有连接、分组依据和多选中更改了它。

© www.soinside.com 2019 - 2024. All rights reserved.