Как построить запрос JPA 2.0 - PullRequest
       15

Как построить запрос JPA 2.0

0 голосов
/ 29 декабря 2011

У меня есть две сущности: событие и комментарий.

@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 для создания запроса, который выбирает все события, которые имеют по крайней мереодин новый комментарий.(Новый комментарий означает, что время его обновления позже указанного времени)

Спасибо за помощь.


Извините, вопрос, который я задал выше, не завершен: то, что я хочу, этоиспользуйте Criteria API для создания запроса, который выбирает все события, которые имеют хотя бы один новый комментарий , а 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();

Приведенный выше код может выбирать события с новыми комментариями, но теперь я не знаю, как добавить условие об идентификаторе события.

Ответы [ 2 ]

1 голос
/ 29 декабря 2011

Создайте объединение для события и примените ограничение на ID события:

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

А затем используйте метод CriteriaBuilder и метод для объединения двух предикатов в один, как показано ответом Лукаса.

1 голос
/ 29 декабря 2011

CriteriaBuilder имеет метод и (Предикат ...) . Затем вам нужно соединить два предиката:

cq.where(cb.and(lastCheckedTimeCondition, someEventIdCondition));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...