【发布时间】:2011-06-12 16:23:11
【问题描述】:
我正在玩 JPA 和其他 Java EE 6 的东西,但现在我在使用标准 Builder 进行类型查询时遇到了一些问题。 我的 poc 的商业案例是一个 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 和泛型将其写下来。我什至没有得到一段可能在其他时候失败的可编译代码,因为我不确定子查询的类型应该是什么。 我现在正在搜索很多示例,但它们大多只是使用原始类型或使用子查询来检索 in-clause 左侧的元素。
也许我只见树木不见森林,但我真的很困惑。 :(
【问题讨论】: