Использование предложения GROUP BY / HAVING в запросе JPA

У меня есть два класса с родителем / детьми от одного до многих отношений:

родитель:

@Entity 
@Table(name="RMS.COMMITMENT_REGISTER")
public class CommitmentRegister {

    @Id
    @Column(name="COMMIT_REG_ID")
    private int id;

    @OneToMany(fetch=FetchType.EAGER)
    @JoinColumn(name="COMMIT_REG_ID")
    private List<CommitmentRegisterDetail> details;

    public int getId() {
        return id;
    }

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

    public List<CommitmentRegisterDetail> getDetails() {
        return details;
    }

    public void setDetails(List<CommitmentRegisterDetail> details) {
        this.details = details;
    }

}

и ребенок:

@Entity 
@Table(name="RMS.COMMITMENT_REGISTER_DETAIL")
public class CommitmentRegisterDetail {

    @Id
    @Column(name="COMMIT_REG_DETAIL_ID")
    private int id;

    @Column(name="AMOUNT")
    private BigDecimal amount;

    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="COMMIT_REG_ID")
    private CommitmentRegister commitmentRegister;

    public int getId() {
        return id;
    }

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

    public BigDecimal getAmount() {
        return amount;
    }

    public void setAmount(BigDecimal amount) {
        this.amount = amount;
    }

    public CommitmentRegister getCommitmentRegister() {
        return commitmentRegister;
    }

    public void setCommitmentRegister(CommitmentRegister parent) {
        this.commitmentRegister = parent;
    }

}

Я хотел бы запросить CRs, общая сумма деталей которого составляет более 100. Я использую следующий запрос:

    StringBuffer sql = new StringBuffer();

    sql.append( " SELECT CR " );
    sql.append( " FROM CommitmentRegister CR " );
    sql.append( " LEFT JOIN CommitmentRegisterDetail CRD ON ( CRD.commitmentRegister = CR ) ");
    sql.append( " WHERE CR.id >= 91000 " );

    sql.append( " GROUP BY CR " );

    sql.append( " HAVING SUM( CRD.amount ) > 100 " );

    Query q = em.createQuery( sql.toString() );

    return q.getResultList();

Но я получаю следующую ошибку:

Local Exception Stack: 
Exception [EclipseLink-6015] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345): org.eclipse.persistence.exceptions.QueryException
Exception Description: Invalid query key [amount] in expression.
Query: ReportQuery(referenceClass=CommitmentRegister jpql=" SELECT CR  FROM CommitmentRegister CR  LEFT JOIN CommitmentRegisterDetail CRD ON ( CRD.commitmentRegister = CR )  WHERE CR.id >= 91000  GROUP BY CR  HAVING SUM( CRD.amount ) > 100 ")

Запрос выполняется нормально без строки HAVING, и правильные сведения назначаются родителю (CR).

Спасибо заранее.

Структура таблицы в случае, если это актуально

COMMITMENT_REGISTER
    COMMIT_REG_ID

COMMITMENT_REGISTER_DETAIL
    COMMIT_REG_DETAIL_ID
    COMMIT_REG_ID
    AMOUNT

1 ответ

  1. Я предполагаю, что это должно сделать больше с соединением, чемHAVING, так HAVINGкак должно работать в документах EclipseLink .

    Возможно, попробуйте что-то подобное и посмотрите, как это происходит:

    StringBuffer sql = new StringBuffer();
    
    sql.append( " SELECT CR " );
    sql.append( " FROM CommitmentRegisterDetail CRD " );
    sql.append( " LEFT JOIN CRD.commitmentRegister CR ");
    sql.append( " WHERE CR.id >= 91000 " );
    sql.append( " GROUP BY CRD.commitmentRegister " );
    sql.append( " HAVING SUM( CRD.amount ) > 100 " );
    
    Query q = em.createQuery( sql.toString() );
    
    return q.getResultList();