0 0

高手请进--hibernate 子查询,折磨我好几天了30

我有个表用来存储论坛的Topic活Reply,结构如下:
@Entity
@Table(name = "TopicOrReply")
public class TopicOrReply implements Serializable{
private Long id;
private String title;//标题,如果为空,那么表示“回复”。
private TopicOrReply repliedTopic;//指向该回复对应的topic
...

}

现在我想查询topic id是1以及其所有回复的记录集合。
我的做法:
Criteria criteria = ((org.hibernate.Session) em.getDelegate()).createCriteria(TopicOrReply.class);

Criterion criterion4Topic = Restrictions.and(
Restrictions.eq("id",this.getTopicId()),
Restrictions.eq("randomCode",this.getRandomCode())
);


Criteria subCriteria = criteria.createCriteria("repliedTopic");
subCriteria.add(criterion4Topic);

但是这样的查询,只能查询出某topic的所有回复,不包括该topic自身。

因为topic和reply的内容没什么区别【前者多一个title而已】,因此采用了一张表“TopicOrReply”。


请问如何把Topic一起查询出来?
请问如何把Topic一起查询出来?
请问如何把Topic一起查询出来?



问题补充:
还是这里反映快,hibernate.org里面现在基本没有人回答问题了。

2008-05-28 jasongreen (初级程序员)
Criterion criterion4Topic = Restrictions.or(
Restrictions.and(
Restrictions.eq("id",this.getTopicId()),
Restrictions.eq("randomCode",this.getRandomCode())
),
Restrictions.eq("repliedTopic.id",this.getTopicId())
)
~~~~等我验证下。





2008-05-28 jasongreen (初级程序员)
select topic,relies from TopicOrReplies as relies join relies.repliedTopic as topic where topic.id=?

这样可以使topic,replies分离,在程序中比较好控制。也可以对replies进行想要的排序
~~~~~~~~因为我采用的是Seam方案,而且我需要利用
        ScrollableResults cursor = this.getHibernateCriteriaWithoutOrderBy().scroll();
        cursor.last();
        this.totalRecords = cursor.getRowNumber() + 1;//行编号是从0开始的
        cursor.close();
这种模式首先查出记录总数!然后计算分页信息。最后根据药抓取的第N页数据是否存在来决定是否去DB抓取数据。
1.我只想知道记录总数,不想抓取所有记录。
2.我只想抓取第N页的数据。
你这个方法是避开了Criterion的用法,我也考虑过。
但是目前用Criterion对于翻页来的性能来说,非常重要。Query要想计算总记录数还要用count,而用count又不能用order by,很烦的!所以被我废弃了。


问题补充:
Criterion criterion4Topic = Restrictions.or(
Restrictions.and(
Restrictions.eq("id",this.getTopicId()),
Restrictions.eq("randomCode",this.getRandomCode())
),
Restrictions.eq("repliedTopic.id",this.getTopicId())
)
OK!~~~~多谢!!!


但是我依旧不明白一点:
这是我按照兄弟的回答进行改造过的能够运行的代码:
Criterion criterion4Topic = Restrictions.or(
Restrictions.and(
Restrictions.eq("id",this.getTopicId()),
Restrictions.eq("randomCode",this.getRandomCode())
),
Restrictions.eq("repliedTopic.id",this.getTopicId())
);
criteria.add(criterion4Topic);




而原来的代码就多了一句话,为什么就不能执行了呢?
不能运行的代码如下:
Criterion criterion4Topic = Restrictions.or(
Restrictions.and(
Restrictions.eq("id",this.getTopicId()),
Restrictions.eq("randomCode",this.getRandomCode())
),
Restrictions.and(
Restrictions.eq("repliedTopic.id",this.getTopicId()),
Restrictions.eq("repliedTopic.randomCode",this.getRandomCode())
)
);
criteria.add(criterion4Topic);



请兄弟指教。马上给分。


2008年5月28日 09:22

2个答案 按时间排序 按投票排序

0 0

采纳的答案

Criterion criterion4Topic = Restrictions.or(
Restrictions.and(
  Restrictions.eq("id",this.getTopicId()),
  Restrictions.eq("randomCode",this.getRandomCode())
),
Restrictions.eq("repliedTopic.id",this.getTopicId())
)

2008年5月28日 13:14
0 0

select topic,relies from TopicOrReplies as relies join relies.repliedTopic as topic where topic.id=?

这样可以使topic,replies分离,在程序中比较好控制。也可以对replies进行想要的排序

2008年5月28日 13:24

相关推荐

Global site tag (gtag.js) - Google Analytics