java Subselect使用CriteriaBuilder(JPA)检索Installement的右侧
我正在玩JPA和其他JavaEE6的东西,但是现在我在使用CriteriaBuilder进行类型查询时遇到了一些问题。 我的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\u TwitterUser。到目前为止一切都很好。基本查询可以很好地工作
现在我想为一个时间轴选择所有Tweets,这意味着所有用户的Tweets,这些用户在当前登录用户的订阅列表中。我想到了一个使用subselect的解决方案,因此我的sql看起来像:
select * from TWEET where author_id in (
select subscriptions_ID from TWITTERUSER_TWITTERUSER where subscribers_ID = ?loggedInUserId);
这个查询工作得很好,但我不知道如何使用CriteriaBuilder和泛型写下它。我甚至没有得到一段可能在其他点失败的可编译代码,因为我不确定子查询的类型应该是什么。 我现在搜索了很多示例,但它们大多只是使用原始类型或使用子查询来检索in子句左侧的元素
也许我想念树林,但我真的很困惑(
# 1 楼答案
再次感谢你们的帮助。最后,我根据您的意见找到了一个解决方案,如下所示:
我的缺点是:
注:我的解决方案完全没有选择用户自己的推文!^
# 2 楼答案
这里有一个类似的条件查询示例
http://en.wikibooks.org/wiki/Java_Persistence/Querying#Subselect.2C_querying_all_of_a_ManyToMany_relationship
# 3 楼答案
在JPQL中,表达这一点的一种方式类似于以下内容:
由于标准几乎直接遵循JPQL模型,这可能会让您开始学习