首页 > 解决方案 > 如何加入两个条件查询

问题描述

我有一个要进行条件查询的查询

select u.email, st.total_amount, st.company_total  from users u
join (select user_id, SUM(balance) as total_amount,SUM(company_count) as company_total from subscription s
      where s.is_active = 0
group by user_id) st on u.id = st.user_id 
where u.is_active = 0
order by st.company_total 

我已经做了1个条件查询

CriteriaQuery<UserImpl> innerQuery = builder.createQuery(UserImpl.class);
            Root<Subscription> subscriptionRoot = innerQuery.from(Subscription.class);
            innerQuery.multiselect(subscriptionRoot.get("user").get("id"), builder.sum(subscriptionRoot.get("balance")),
                    builder.sum(subscriptionRoot.get("companyCount")));

我不知道如何在 spring hibernate JPA 中进行外部查询。可以帮忙。

标签: javaspringhibernatespring-data-jpa

解决方案


定义一个 JOIN 子句非常简单。您首先在 CriteriaQuery 对象上调用 from 方法以获取 Root 对象。在下一步中,您可以调用 join 方法来定义您的 JOIN 子句。

以下是 Docs 的示例,您可以根据您的示例对其进行操作。

您可以参考 Hibernate 文档以获取连接示例。以下是示例代码。

CriteriaQuery<String> q = cb.createQuery(String.class);
Root<Order> order = q.from(Order.class);
q.select(order.get("shippingAddress").<String>get("state"));

CriteriaQuery<Product> q2 = cb.createQuery(Product.class);
q2.select(q2.from(Order.class)
                 .join("items")
                 .<Item,Product>join("product"));

可参考的文件

下面列出了我发现的另一个简单示例:

<Y> ListJoin<X, Y> join(ListAttribute<? super X, Y> list);

快速示例(假设 Employee 具有多对多关系的任务列表):

CriteriaQuery<Employee> query = criteriaBuilder.createQuery(Employee.class);
Root<Employee> employee = query.from(Employee.class);
ListJoin<Employee, Task> tasks = employee.join(Employee_.tasks);
query.select(employee)
        .where(criteriaBuilder.equal(tasks.get(Task_.supervisor), 
employee.get(Employee_.name)));
TypedQuery<Employee> typedQuery = entityManager.createQuery(query);
List<Employee> employees = typedQuery.getResultList();

参考:这里


推荐阅读