私は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 lastCheckedTime
とLong 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を追加する方法がわからないイベントを選択することができます。
これはq/aフォーマットにはあまり適していないと思います。あなたは譲渡を掲示して人々にそれをするよう頼むべきではありません。何かを試してみると、特定の助けを求めることができます。 –
このような静的クエリには、JPQLの方がずっと簡単です。なぜJPQLを使用しないのですか?さらに、いったんJPQLクエリを取得すると、それを条件に変換する方が簡単になります。 –
@ArjanTijms ok、私はこれまでに試したことを投稿します。 – John