Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SpringBoot:如何使用谓词创建包含“join”和“groupby”的动态查询_Mysql_Spring Boot_Spring Data Jpa_Criteria Api - Fatal编程技术网

Mysql SpringBoot:如何使用谓词创建包含“join”和“groupby”的动态查询

Mysql SpringBoot:如何使用谓词创建包含“join”和“groupby”的动态查询,mysql,spring-boot,spring-data-jpa,criteria-api,Mysql,Spring Boot,Spring Data Jpa,Criteria Api,我的帖子请求主体将是 { "queryCondition":[ { "filter":"status", "filterlist":["Closed","New","Resolved"...] }, { "filter":"assigned_team", "filterlist":["A",

我的帖子请求主体将是

{
    "queryCondition":[
            {
                "filter":"status",
                "filterlist":["Closed","New","Resolved"...]
            },
            {
                "filter":"assigned_team",
                "filterlist":["A","B","C"...]
            },
            {
                "filter":"assigned_to",
                "filterlist":["ram","govind","ajith"...]
            },
            {
                "filter":"duration",
                "filterlist":["2020-02-01","2020-05-01"....]
            }
            ....
            ....
        ],
    "durationField":"created_date"
}
我动态地接收columnsfilter和valuesfilterlist,我需要使用它们来构建此查询

SELECT * FROM tickets 
WHERE ticket_id IN (SELECT ticket_id FROM Tickets WHERE created_date >= '2020-02-01') AND created_date '2020-05-01'
AND status IN ('Closed','Resolved','New')
AND assigned_team IN ('A' , 'B', 'C')
AND assigned_to IN ('ram','govind','ajith');
我使用谓词动态构建了这个查询,它运行良好

@Override
public List<Tickets> conditionedQuery(QueryCondition queryCondition) {
    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<Tickets> query = cb.createQuery(Tickets.class);
    Root<Tickets> ticket = query.from(Tickets.class);
    List<Predicate> predicatessub = new ArrayList<>();
    for(FilterConditions fc:queryCondition.getQueryCondition()) {
        if(fc.getFilter().equals("duration")) {
            Predicate ps = cb.greaterThanOrEqualTo(ticket.get(queryCondition.getDurationField()), fc.getFilterlist()[0]);
            Predicate pe = cb.lessThan(ticket.get(queryCondition.getDurationField()), fc.getFilterlist()[1]);
            predicatessub.add(cb.and(ps,pe));
        }else 
        {
            List<Predicate> predicates = new ArrayList<>();
            for(int i=0; i<fc.getFilterlist().length; i++) {
                Predicate p = cb.equal(ticket.get(fc.getFilter()),fc.getFilterlist()[i]);
                predicates.add(p);
            }
            predicatessub.add(cb.or(predicates.toArray(new Predicate[predicates.size()])));
        }
    }
    query.select(ticket)
    .where(cb.and(predicatessub.toArray(new Predicate[predicatessub.size()])));
    return entityManager.createQuery(query)
    .getResultList();
}
现在,我想构建一个相当复杂的查询,涉及连接和分组方式。下面是我想使用谓词构建的示例查询

SELECT 
YEAR(pt.created_date),
MONTH(pt.created_date),
pt.assigned_team,
COUNT(tk.ticket_id)
FROM
(SELECT 
    *
FROM
    tickets
WHERE
    ticket_id IN (SELECT 
            ticket_id
        FROM
            Tickets
        WHERE
            resolved_date >= '2020-02-01')
        AND resolved_date < '2020-05-01'
        and assigned_team IN ('A' , 'B', 'C')) pt
    LEFT JOIN
(SELECT 
    *
FROM
    tickets
WHERE
    status IN ('Closed','Resolved','New')
        AND assigned_to IN ('ram','govind','ajith')) tk ON tk.ticket_id = pt.ticket_id
GROUP BY YEAR(pt.created_date) , MONTH(pt.created_date), pt.assigned_team order by 
pt.assigned_team,YEAR(pt.created_date),MONTH(pt.created_date) asc;

请告知如何使用谓词实现这一点,或者是否有比谓词更简单的方法。

您找到方法了吗?没有!还没有。我找不到路。你可能想这么做。你找到路了吗?没有!还没有。我找不到办法。你可能想这么做
public class FilterConditions {
    private String filter;
    private String[] filterlist;
}
SELECT 
YEAR(pt.created_date),
MONTH(pt.created_date),
pt.assigned_team,
COUNT(tk.ticket_id)
FROM
(SELECT 
    *
FROM
    tickets
WHERE
    ticket_id IN (SELECT 
            ticket_id
        FROM
            Tickets
        WHERE
            resolved_date >= '2020-02-01')
        AND resolved_date < '2020-05-01'
        and assigned_team IN ('A' , 'B', 'C')) pt
    LEFT JOIN
(SELECT 
    *
FROM
    tickets
WHERE
    status IN ('Closed','Resolved','New')
        AND assigned_to IN ('ram','govind','ajith')) tk ON tk.ticket_id = pt.ticket_id
GROUP BY YEAR(pt.created_date) , MONTH(pt.created_date), pt.assigned_team order by 
pt.assigned_team,YEAR(pt.created_date),MONTH(pt.created_date) asc;