ENTITY:
@Entity
@Table(name = "S_TALK")
public class STalk {
private String content;
private int id;
private int prohibit;
private int replaySize;
private Set<STalk> replyTalkList ;
private STalk talk;
private Date talkTime;
private STopic topic;
private SUser user;
public STalk() {
super();
}
public STalk(int id) {
this.id = id;
}
public STalk(String userNickname,String photo,Date talkTime,String content,int replyTalkListSize,int id) {
this.id = id;
user = new SUser();
user.setNickName(userNickname);
user.setPhoto(photo);
this.talkTime = talkTime;
this.content = content;
this.replaySize = replyTalkListSize;
}
@Column(name = "S_TALK_CONTENT")
public String getContent() {
return content;
}
@Id
@GeneratedValue
public int getId() {
return id;
}
@Column(nullable = false, name = "S_TALK_PROHIBIT")
public int getProhibit() {
return prohibit;
}
@Transient
public int getReplaySize() {
return replaySize;
}
@OneToMany(mappedBy = "talk")
public Set<STalk> getReplyTalkList() {
return replyTalkList;
}
@ManyToOne
@JoinColumn(name = "S_TALK_PARENT")
public STalk getTalk() {
return talk;
}
@Column(nullable = false, name = "S_TALK_TIME")
public Date getTalkTime() {
return talkTime;
}
@ManyToOne
@JoinColumn(name = "S_TOPIC_ID")
public STopic getTopic() {
return topic;
}
@ManyToOne
@JoinColumn(name = "S_USER_ID")
public SUser getUser() {
return user;
}
public void setContent(String content) {
this.content = content;
}
public void setId(int id) {
this.id = id;
}
public void setProhibit(int prohibit) {
this.prohibit = prohibit;
}
public void setReplaySize(int replaySize) {
this.replaySize = replaySize;
}
public void setReplyTalkList(Set<STalk> replyTalkList) {
this.replyTalkList = replyTalkList;
}
public void setTalk(STalk talk) {
this.talk = talk;
}
public void setTalkTime(Date talkTime) {
this.talkTime = talkTime;
}
public void setTopic(STopic topic) {
this.topic = topic;
}
public void setUser(SUser user) {
this.user = user;
}
}
HQL : (RIGHT)
String hql = " SELECT new list(t2.id,MAX(t2.content),COUNT(t1.id)) FROM STalkt1 RIGHT JOINt1.talk t2 WHERE t2.talk IS NULL ANDt2.topic.id = ? GROUP BY t2.id ";
CONSOLE LOG:
Hibernate:
select
stalk1_.id as col_0_0_,
max(stalk1_.S_TALK_CONTENT) as col_1_0_,
count(stalk0_.id) as col_2_0_
from
S_TALK stalk0_
right outer join
S_TALK stalk1_
on stalk0_.S_TALK_PARENT=stalk1_.id
where
(
stalk1_.S_TALK_PARENT is null
)
and stalk1_.S_TOPIC_ID=?
group by
stalk1_.id
HQL:(ERROR)
String hql = " SELECT new list(t1.id,MAX(t1.content),COUNT(t2.id)) FROM STalk t1 LEFT JOIN t1.talk t2 WHERE t1.talk IS NULL AND t1.topic.id = ? GROUP BY t1.id "
CONSOLE LOG:
Hibernate:
select
stalk0_.id as col_0_0_,
max(stalk0_.S_TALK_CONTENT) as col_1_0_,
count(stalk1_.id) as col_2_0_
from
S_TALK stalk0_
left outer join
S_TALK stalk1_
on stalk0_.S_TALK_PARENT=stalk1_.id
where
(
stalk0_.S_TALK_PARENT is null
)
and stalk0_.S_TOPIC_ID=?
group by
stalk0_.id
使用hibernate HQL JOIN 查询时, 老是使用首张表的ManyToOne字段进行关联,不会真实去根据关联关系查找。后来经过半天的摸索,发现调个顺序就可以解决了!坑爹啊!!!