简体   繁体   English

如何在 jpa 规范或条件查询中编写此 PostgreSQL 查询?

[英]How to write this PostgreSQL query in jpa specification or criteria query?

i need to implement the following query as a jpa specification or criteria query?我需要将以下查询实现为 jpa 规范或条件查询?

Please let me know how this can be done using inner joins and also a group by clause.请让我知道如何使用内部联接和 group by 子句来完成此操作。

select SUM(r.story_points) as SP,count(r.user_id) as mx,r.user_id,e.component_id from task r inner join component e on r.component_id =e.component_id group by r.user_id,e.component_id; select SUM(r.story_points) as SP,count(r.user_id) as mx,r.user_id,e.component_id from task r inner join component e on r.component_id =e.component_id group by 8818122589.component_id_id_89,e.component_id group by r 内部连接组件e ;

My Task Entity:我的任务实体:

package com.sysco.sprintreporting.entity;

import com.fasterxml.jackson.annotation.JsonBackReference;

import lombok.*;

import javax.persistence.*;
import java.time.LocalDate;

@Entity
@Table(name = "Task")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString

public class Task {

    @Id
    @Column(name = "issue_key")
    private String issueKey;

    @Column(name = "issue_id")
    private long issueId;

    @Column(name = "issue_type")
    private String issueType;

    @Column(name = "storyPoints")
    private Double storyPoints;

    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "user_id")
    @JsonBackReference
    private User assignee_id;

    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "component_id")
    @JsonBackReference
    private Component component_id;

}

My Component Entity:我的组件实体:

package com.sysco.sprintreporting.entity;

import java.util.Set;

import javax.persistence.*;


import lombok.*;

@Entity
@Table(name = "Component")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Component {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "component_id")
    private int id;

    @Column(name = "component_name")
    private String name;

    @Column(name = "component_desc")
    private String description;


    @OneToMany(mappedBy = "component_id", cascade = CascadeType.ALL)
    private Set<Task> Task;

}

To do an aggregated query with joins with Criteria Query API you can use Tuple Query .要使用Criteria Query API进行聚合查询,您可以使用Tuple Query Tuple Query allows to select multiple values/columns with multiselect method.元组查询允许使用多选方法 select 多个值/列。

Something like this (not tested):像这样的东西(未测试):

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Tuple> mainQuery = cb.createTupleQuery();

Root<Task> rootTask = mainQuery.from(Task.class);
Join<Task, Component> componentJoin = rootTask.join("component_id");

mainQuery.multiselect(
    rootTask.get("user_id"),
    componentJoin.get("component_id"),
    cb.sum(rootTask.get("story_points").alias("SP"),
    cb.count(rootTask.get("user_id")).alias("mx")
);

mainQuery.groupBy(
    rootTask.get("user_id"), 
    componentJoin.get("component_id")
);

TypedQuery<Tuple> query = entityManager.createQuery(mainQuery);

List<Tuple> tasks = query.getResultList();

You can see some examples of using Tuple Query: JPA Criteria API - Multiple Query selection and use of Tuple您可以看到一些使用 Tuple Query 的示例: JPA Criteria API - Multiple Query selection and use of Tuple

Regards.问候。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM