2016-05-05 3 views
0

У меня есть два класса с родителем/детьми один-к-многим:Использование 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; 
    } 

} 

Я бы хотел запросить CR, чьи данные в общей сложности превышают 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 

ответ

0

Мое предположение в том, что он должен делать больше с джойн чем HAVING, поскольку HAVING должен работать в соответствии с EclipseLink docs.

Возможно, попробовать что-то вроде этого, и посмотреть, как он идет:

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(); 
+0

Спасибо. Я бы попробовал это, но у меня получился неполный результат, поскольку у некоторых CR нет CRD. – Holden

+0

Для ударов я попытался перевернуть сущности, и я получил ту же ошибку. [147, 157] Путь поля состояния «CRD.amount» не может быть разрешен к допустимому типу. – Holden

+0

На самом деле, вы были правы. Я сделал это неправильно в своей предыдущей попытке. Я перевернул объекты в соединении, и запрос выполняется без ошибок в строке HAVING. У меня все еще есть проблема, что я не получаю CR без каких-либо подробностей, но по крайней мере я на один шаг ближе. – Holden

Смежные вопросы