Я играю с JPA и другими вещами Java EE 6, но теперь я столкнулся с некоторыми проблемами с запросом типов, использующим построитель критериев.Бизнес-кейс для моего документа - клон Twitter, поэтому у меня есть пользователи, у которых есть список подписчиков и подписок, и я получил твиты.
@Entity
public class Tweet {
@Id @GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@ManyToOne
private TwitterUser author;
@ManyToOne
private TwitterUser receiver;
@Temporal(TemporalType.TIMESTAMP)
private Date datetime;
private String message;
}
@Entity
public class TwitterUser {
@Id @GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String username;
private String displayname;
private String password;
private String email;
@Temporal(TemporalType.TIMESTAMP)
private Date since;
@ManyToMany(cascade=CascadeType.ALL)
private List<TwitterUser> subscriptions;
@ManyToMany(mappedBy = "subscriptions")
private List<TwitterUser> subscribers;
}
Модель данных, сгенерированная JPA, состоит из 3 таблиц: Tweet, TwitterUser и TwitterUser_TwitterUser.Пока все хорошо.Базовые запросы работают хорошо.
Теперь я хочу выбрать все твиты для временной шкалы, что означает все твиты пользователей, которые находятся в списке подписок текущего вошедшего в систему пользователя.Я подумал о решении с использованием подвыбора, поэтому мой sql будет выглядеть так:
select * from TWEET where author_id in (
select subscriptions_ID from TWITTERUSER_TWITTERUSER where subscribers_ID = ?loggedInUserId);
Этот запрос работает хорошо, но я не знаю, как записать его с помощью CriteriaBuilder и обобщений.Я даже не получаю скомпилируемый кусок кода, который может потерпеть неудачу в какой-то другой момент, потому что я не уверен, каким должен быть тип подзапроса.Я искал много примеров сейчас, но они в основном просто используют raw-типы или используют подзапрос для извлечения элемента левой части предложения.
Может быть, я скучаю по дереву для деревьевно я действительно озадачен здесь.(