我有 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>)
在当前场景中,Join 语句未选择元模型
Join<Checkout, Donation> donation = checkout.join(Checkout_.donation);
所以我将 Metamodel 类实例更改为我在 Campaign Entity 中指定的变量,如下所示
Join<Checkout, Donation> donation = checkout.join("donation");
并在所有连接、分组依据和多选中更改了它。