2016-05-05 4 views
0

JPAクエリにHAVING句:使用してGROUP BY/Iは、親/子供1対多の関係で2つのクラスを持っている

親:

@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; 
    } 

} 

詳細の合計が100を超えるCRをクエリしたいのですが、次のクエリを使用しています:

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 ") 

クエリが有するラインなしで正常に動作し、右の詳細は、親(CR)に割り当てられています。

ありがとうございます。

表構造の場合には、それは

COMMITMENT_REGISTER 
    COMMIT_REG_ID 

COMMITMENT_REGISTER_DETAIL 
    COMMIT_REG_DETAIL_ID 
    COMMIT_REG_ID 
    AMOUNT 

答えて

0

関連性のここでの私の推測では、それはHAVINGEclipseLink docsごとに動作する必要があるため、HAVINGより参加して多くの関係しているということです。

おそらく、このような何かを試してみて、それがどのようになる参照:

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

関連する問題