У меня есть два класса с родителем/детьми один-к-многим:Использование 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
Спасибо. Я бы попробовал это, но у меня получился неполный результат, поскольку у некоторых CR нет CRD. – Holden
Для ударов я попытался перевернуть сущности, и я получил ту же ошибку. [147, 157] Путь поля состояния «CRD.amount» не может быть разрешен к допустимому типу. – Holden
На самом деле, вы были правы. Я сделал это неправильно в своей предыдущей попытке. Я перевернул объекты в соединении, и запрос выполняется без ошибок в строке HAVING. У меня все еще есть проблема, что я не получаю CR без каких-либо подробностей, но по крайней мере я на один шаг ближе. – Holden