Привет
Сценарий, над которым я работаю, похож на твиттер. То, что я хочу сделать, это получить статуи подписанных пользователей, используя API критериев гибернации.
Используемые классы:
User
(Этот имеет много-много-многократное отношение к себе, отображаемому в следующей таблице)
Status
(у этого есть внешний ключ пользователя, который его поместил)
Если я напишу это в простом старом sql, это будет так.
select * from status where status.user_id IN(select follow_id from follow where follow.user_id = 1)
Как добиться этого результата с помощью Hibernate Criteria API?
@javax.persistence.Table(name = "user", uniqueConstraints = {
@UniqueConstraint(columnNames = "user_name")})
@Entity
public class TweeUser implements Serializable {
private int id;
@javax.persistence.Column(name = "id")
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
private String userName;
@Column(name = "user_name")
@Basic
public String getUserName() {
return this.userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
private String fullName;
@javax.persistence.Column(name = "full_name")
@Basic
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
private String email;
@javax.persistence.Column(name = "email")
@Basic
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
private String password;
@javax.persistence.Column(name = "password")
@Basic
public String getPassword() {
return password;
}
private Set<TweeUser> followingUsers;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "follow", joinColumns = {@JoinColumn(name = "user_id")}, inverseJoinColumns = {@JoinColumn(name = "follow_id")},
uniqueConstraints = {@UniqueConstraint(columnNames = {"user_id", "follow_id"})})
public Set<TweeUser> getFollowingUsers() {
return followingUsers;
}
public void setFollowingUsers(Set<TweeUser> followingUsers) {
this.followingUsers = followingUsers;
}
}
Статус объекта
@javax.persistence.Table(name = "status")
@Entity
public class TweeStatus implements Serializable{
private int id;
@javax.persistence.Column(name = "id")
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
private String rawStatus;
@javax.persistence.Column(name = "raw_status")
@Basic
public String getRawStatus() {
return rawStatus;
}
public void setRawStatus(String rawStatus) {
this.rawStatus = rawStatus;
}
private Date createTime;
@Temporal(TemporalType.TIMESTAMP)
@javax.persistence.Column(name = "create_time")
@Basic
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
private TweeUser tweeUser;
@ManyToOne
@JoinColumn(name = "user_id")
public TweeUser getTweeUser(){
return tweeUser;
}
public void setTweeUser(TweeUser tweeUser){
this.tweeUser = tweeUser;
}
private Set<TweeHashTag> tweeHashTags;
@ManyToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
@JoinTable(name = "status_hash", joinColumns = { @JoinColumn(name = "status_id") }, inverseJoinColumns = { @JoinColumn(name = "hash_id")},uniqueConstraints = {
@UniqueConstraint( columnNames = { "status_id", "hash_id" } ) })
public Set<TweeHashTag> getTweeHashTags(){
return tweeHashTags;
}
public void setTweeHashTags(Set<TweeHashTag> tweeHashTags){
this.tweeHashTags = tweeHashTags;
}
}