2012-02-10 7 views
4

私は制御できないひどく正規化されていないデータベースからいくつかの値を読んでいます。コールは大学部門のアナウンスを取得し、ユーザーが複数の部門に所属する場合(可能な場合)、これらのユーザーに対して同じ結果が複数回返されます。しかし、いくつかの部門は異なるアナウンスを持つことがありますが、一部のアナウンスは異なる場合があります。個々の列のJPAでDISTINCTキーワードを使用する

個々の列のJPAでDISTINCTキーワードを使用する方法はありますか?これは私が現在クエリに持っているものです:

String jpql = "SELECT DISTINCT annoucement FROM Announcment announcement " 
       + "WHERE (announcement.date <= :now AND announcement.endDate >= :now) " 
       + "AND announcement.approved = true AND announcement.departmentId IN (:departmentIDs)"; 

TypedQuery<Announcement> query = entityManager.createQuery(jpql, 
       Announcement.class); 
query.setParameter("now", new Date()); 
query.setParameter("departmentIDs", departmentIDs); 

部門IDの値は異なるかもしれませんが、発表、日付などはすべて同じです。このクエリは重複した値を持つアナウンスを返します。

+0

偶然に使用しているJPAを知っていますか? – Bhushan

+0

Hibernate 3.6.6とhibernate-jpa-2.0-api-1.0.1.Final.jar – acvcu

答えて

1

2私はあなたの問題を思い付く方法:

  1. "から(depIdなし)の異なるannoucement.x、annoucement.y、annoucement.z を...選択..."

    は、アナウンスメントを作成します。 は永続オブジェクトとその参照を失いました。必要に応じてDaoオブジェクトによって を再度ロードする必要があります。

  2. あなたの通知クラスのequals()[hashCode()too]を のequals()に置き換えると、depIdは比較対象外にする必要があります。リストの内容を にしてから、リストをSetに変換してください。あなたは 「個別の」オブジェクト

はそれがより良いアプローチは、あなたが興味を持っている列のみを保持してより具体的なオブジェクトを返すことです私の意見では

+0

私はしばらくかかりましたが、私は提案#2を使ってこれを修正しました。ありがとう。 – acvcu

0

に役立ちます願っていました答えは次も参照してください:。

JPQL Constructor Expression - org.hibernate.hql.ast.QuerySyntaxException:Table is not mapped

あなたの例に従えば、あなたは、あなたが興味を持っている唯一の列を持つ新しいオブジェクトを作成することができます

SELECT DISTINCT new com.mypackage.MyInterestingAnnouncement(annoucement.x, annoucement.y, annoucement.z) FROM Announcment annoucement 
関連する問題