2011-12-29 30 views
0

私は2つのエンティティを持っています:イベントとコメント。JPA 2.0クエリを構築する方法

@Entity 
@Table(name = "events") 
public class Event extends BaseEntity { 
    @Id 
    @Column(name = "event_id") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    protected Long eventId; 

    @Column(name = "title", length = 200) 
    protected String title; 

    @OneToMany(mappedBy = "event", cascade = CascadeType.REMOVE) 
    @LazyCollection(LazyCollectionOption.FALSE) 
    protected List<Comment> comments; 
} 

@Entity 
@Table(name = "comments") 
public class Comment extends BaseEntity { 
    @Id 
    @Column(name = "comment_id") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    protected Long commentId; 

    @ManyToOne(optional = false) 
    @JoinColumn(name = "event_id", referencedColumnName="event_id", nullable = false) 
    protected Event event; 

    @Column(name = "update_time", nullable = false) 
    @Temporal(TemporalType.TIMESTAMP) 
    protected Date updatedTimestamp; 
} 

各イベントにはコメントリストがあり、各コメントには更新時間があります。

Criteria APIを使用して、少なくとも1つの新しいコメントを持つすべてのイベントを選択するようなクエリを作成したいと考えています。 (新しいコメントは、その更新時刻が指定された日付時刻より遅いことを意味します)

私を助けてくれてくれてありがとう。申し訳ありません


私は上記尋ねた質問は完全ではありません。私が欲しいのは少なくとも1件の新しいコメントを持っており、EVENTIDは、いくつかの特定のイベントIDに等しいすべてのイベントを選択し、このようなクエリを構築するために使用基準のAPIであります。私が試してみました

:(Date lastCheckedTimeLong eventIdを考えると)

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<Event> cq = cb.createQuery(Event.class); 
Root<Comment> c = cq.from(Comment.class); 
Predicate lastCheckedTimeCondition = cb.greaterThanOrEqualTo(
    c.get(Comment_.updatedTimestamp), lastCheckedTime); 
cq.where(lastCheckedTimeCondition); 
cq.select(c.get(Comment_.event)); 
TypedQuery<Event> query = em.createQuery(cq); 
result = query.getResultList(); 

上記のコードは、新しいコメントを持っていますが、今、私はイベントIDについてconditonを追加する方法がわからないイベントを選択することができます。

+1

これはq/aフォーマットにはあまり適していないと思います。あなたは譲渡を掲示して人々にそれをするよう頼むべきではありません。何かを試してみると、特定の助けを求めることができます。 –

+0

このような静的クエリには、JPQLの方がずっと簡単です。なぜJPQLを使用しないのですか?さらに、いったんJPQLクエリを取得すると、それを条件に変換する方が簡単になります。 –

+0

@ArjanTijms ok、私はこれまでに試したことを投稿します。 – John

答えて

1

は、イベントに参加を作成し、イベントのIDに制限を適用します。

Join<Comment, Event> event = c.join(Comment_.event); 
Predicate eventIdPredicate = cb.eq(event.get(Event_.eventId), theEventId); 

そして2を組み合わせることCriteriaBuilderのやメソッドを使用しますルーカスの答えが示すように述語を1つにする。

+0

ああ、クレイジー、私はこの場合の参加の必要性を忘れてしまった。 JPAの冗長性はいつも私に届きます。 –

+0

こんにちは、上記のコードを使用してイベントを取得すると、関連するコメントを取得できません。例外があります。メソッドの呼び出し中にcom.sun.jdi.InvocationExceptionが発生しました。なぜこれが起こるか知っていますか? – John

+0

いいえスタックトレースがあれば役立ちます。 –

1

CriteriaBuilderは、and(Predicate...)の方法を有する。次に、あなたの2つの述部を接続します:

cq.where(cb.and(lastCheckedTimeCondition, someEventIdCondition)); 
関連する問題