2017-03-11 1 views
0

私はHibernate 4.0.1のJPAを使用しています。私は関係がManyToOneの2つのテーブルを持っています。JPAとDistinctの2つの列でSUMのような集計関数を実行するには?

私は会社に属し、特定の状態(実行中/終了/ ...)を持つ契約のすべての価値を合計する必要があります。このような

私のSQLは:

SELECT SUM(contract.totalAmount) FROM Contract contract, CompanyEntity company 
WHERE contract.state LIKE :contractState AND contract.company.id = :companyId" 

しかし、それは何らかの形で複製し、合計を返します。 SUM照会を書くと、postが読まれます。

私の質問は、JPA NamedQueryでDISTINCTを使用してSUMのような集計関数を作成できますか?

おかげで、すべて、

+0

(と仮定すると、同社はJoinTable注釈との契約クラス内の変数名です)。 「企業」エンティティにEXPLICIT _JOIN_を使用していない理由は何ですか? –

+0

クエリから 'CompanyEntity company'を削除します。この不要なエンティティをfrom句に追加することによって、クロス結合を行っています。 –

+0

あなたのコメントの後に@NeilStocktonに感謝します。ちょうどCompanyEntityの部分を削除してから、重複したレコードはありません:) –

答えて

0

はい、クエリ内SUM(distinct contract.totalAmount)はdistint数になります。そして、JB Nizetが述べたように、重複したレコードの理由はcompanyEntityとのクロス・ジョイントのためです。正しい方法は、明示的に結合を使用し、会社IDにフィルタを適用することです。

SELECT SUM(contract.totalAmount) FROM Contract contract Join contract.company cpy 
WHERE contract.state LIKE :contractState AND cpy.id = :companyId 

JPQL、SQLではないです

関連する問題