【发布时间】:2011-12-29 12:05:15
【问题描述】:
我有两个实体:事件和评论。
@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;
}
所以每个事件都有一个 cmets 列表,每个评论都有一个更新时间。
我想使用 Criteria API 来构造一个查询,以便选择具有至少一个新 cmets 的所有事件。 (新评论意味着它的更新时间晚于给定的日期时间)
感谢任何人帮助我。
抱歉,我上面问的问题不完整:我想要的是使用 Criteria API 构造一个查询,以便选择具有至少一个新 cmets 并且 eventId 等于某个特定 eventId 的所有事件.
我试过了:(给定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();
上面的代码可以选择有新cmet的事件,但是现在不知道怎么添加eventId的条件。
【问题讨论】:
-
我认为这不适合这里的 q/a 格式。你不应该只是发布一个任务并要求人们去做。更好的是尝试一些东西,当你遇到困难时寻求具体的帮助。
-
JPQL 更容易用于这样的静态查询。你为什么不使用JPQL?此外,一旦有了 JPQL 查询,将其转换为条件会更容易。
-
@ArjanTijms 好的,我会发布到目前为止我尝试过的内容。
-
@Thomas 我已经发布了到目前为止我尝试过的内容。
-
@JBNizet 感谢您的建议,但是为了与之前的代码保持一致,我需要使用 Criteria API。
标签: java sql hibernate jpa jpa-2.0