如何将此SQL查询转换为JPA criteriaBuilder查询?

时间:2017-05-22 09:07:20

标签: sql jpa criteria

我有以下数据库图:

enter image description here

我有以下非常简单的SQL查询:

SELECT Subject.id, Subject.name, subSelect.count
FROM
    (SELECT Subject.id AS id, COUNT(*) AS count
    FROM Question
    JOIN Subject_Question ON Subject_Question.question_id = Question.id
    JOIN Subject ON Subject.id = Subject_Question.subject_id
    WHERE Subject.state = 0 AND Question.state = 0
    GROUP BY Subject.id) AS subSelect
JOIN Subject ON Subject.id = subSelect.id

我的任务是根据JPA的criteriaBuilder提供此查询Java应用程序。

这是我在Java应用程序中的域类:

@Entity
@Table(name = "Question")
public class Question {

    Long id;
    String text;
    ActiveUser activeUser;
    Long dateCreation;
    Long dateStateSetting;
    EntityState state;

    Set<Subject> subjects;

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Column(name = "text", length = 5000, nullable = false)
    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    @ManyToOne(cascade = CascadeType.REMOVE)
    @JoinColumn(name = "activeUser", nullable = false)
    public ActiveUser getActiveUser() {
        return activeUser;
    }

    public void setActiveUser(ActiveUser activeUser) {
        this.activeUser = activeUser;
    }

    @Column(name = "dateCreation")
    public Long getDateCreation() {
        return dateCreation;
    }

    public void setDateCreation(Long dateCreation) {
        this.dateCreation = dateCreation;
    }

    @Column(name = "dateStateSetting")
    public Long getDateStateSetting() {
        return dateStateSetting;
    }

    public void setDateStateSetting(Long dateStateSetting) {
        this.dateStateSetting = dateStateSetting;
    }

    @Enumerated(EnumType.ORDINAL)
    @Column(name = "state", nullable = false)
    public EntityState getState() {
        return state;
    }

    public void setState(EntityState state) {
        this.state = state;
    }

    @ManyToMany(mappedBy = "questions")
    public Set<Subject> getSubjects() {
        return subjects;
    }

    public void setSubjects(Set<Subject> subjects) {
        this.subjects = subjects;
    }
}

并且

@Entity
@Table(name = "Subject")
public class Subject {

    Long id;
    String name;
    EntityState state;
    Long dateCreation;
    Boolean ifGroup;

    List<Question> questions;

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Column(name = "name", nullable = false)
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Enumerated(EnumType.ORDINAL)
    @Column(name = "state", nullable = false)
    public EntityState getState() {
        return state;
    }

    public void setState(EntityState state) {
        this.state = state;
    }

    @Column(name = "dateCreation")
    public Long getDateCreation() {
        return dateCreation;
    }

    public void setDateCreation(Long dateCreation) {
        this.dateCreation = dateCreation;
    }

    @Column(name = "ifGroup", nullable = false)
    public Boolean getIfGroup() {
        return ifGroup;
    }

    public void setIfGroup(Boolean ifGroup) {
        this.ifGroup = ifGroup;
    }

    @ManyToMany(cascade = CascadeType.REMOVE)
    @JoinTable(
            name = "Subject_Question",
            joinColumns = @JoinColumn(name = "subject_id"),
            inverseJoinColumns = @JoinColumn(name = "question_id")
    )
    public List<Question> getQuestions() {
        return questions;
    }

    public void setQuestions(List<Question> questions) {
        this.questions = questions;
    }
}

我从以下开始:

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();

CriteriaQuery<Question> criteria = criteriaBuilder.createQuery(Question.class);
Root<Question> i = criteria.from(Question.class);

criteria.multiselect(
    i.get("id"),
    criteriaBuilder.count(i)).

但是在这一点上我遇到了一个问题 - 我必须加入Subject_Question但是我没有在Java应用程序中使用它。

那么可以用JPA中的criteriaBuilder来表示这个SQL查询吗?

0 个答案:

没有答案