求助:hibernate 多对多 多对一 多表连接查询问题。

jolestar 2006-11-02 03:01:01
问题描述:每个Article可以有多个Tag,而每个Tag可以被多个Article使用,二者之间是多对多关系。然后每个Tag属于一个TagClass,而者之间是多对一关系。
现在我怎样用hql把所有属于一个TagClass的Article搜索出来?(严格的应该说是使用了该tagClass下的Tag的所有Article)。

代码演示:
public class Article
{
Long id;
String title;
.......
Set<Tag> tags = new HashSet<Tag>();
........
}

public class Tag
{
Long id;
String tagTitle;
TagClass tagClass;
........
Set<Article> arts = new HashSet<Article>();
........

}

public class TagClass
{
Long id;
String className;
.........
Set<Tag> tags = new HashSet<Tag>();
..........
}

在DAO层要实现的方法。
public List<Article> findArticleByTagClass(TagClass tagClass);



莫非我非得建立一个Article 到TagClass之间的多对一关系?这样是在不便于管理啊。比方修改了Tag所属的TagClass,还得修改Article和TagClass的对应关系。

问题描述完毕,请高手赐教。
...全文
988 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
honeyego 2006-11-08
  • 打赏
  • 举报
回复
我现在就是被关系映射搞得晕头转向
晕死啊,看了好久,什么都没搞出来
谢谢hbwhwang的经验之谈
hbwhwang 2006-11-06
  • 打赏
  • 举报
回复
我建议你不要用关系映射,这玩意真不好掌握,象个泥鳅。
也不是说无法掌握,而是花太多的时间去掌握不值得。
jolestar 2006-11-06
  • 打赏
  • 举报
回复
ok。偶也是这么想地。
hbwhwang 2006-11-06
  • 打赏
  • 举报
回复
第二个问题是:
如果我要解除Article和Tag之间的关联,是否非得加载Article的tags Set,然后从Set中remove,然后再update?
有没有办法直接将而者关联表中的字段删除,而不用加载。hql怎么写?
======
答案:不用这么麻烦。简单点,就用Native SQL,自己写个SQL,想怎么删就怎么删!

Hibernate就是个工具而已,不要被一个工具束缚了自己的思想!
jolestar 2006-11-06
  • 打赏
  • 举报
回复
有没人说明一下后一个问题?
要结贴了。
jolestar 2006-11-06
  • 打赏
  • 举报
回复
createAlias创建了tags的别名t。
这里的t是set中一个个具体的tag的代称。所以有tagClass属性了。
sun113 2006-11-04
  • 打赏
  • 举报
回复
Criteria criteria = this.getSession().createCriteria(Article.class)
.createAlias("tags","t")
.add(Expression.eq("t.tagClass",tagClass));
return criteria.list();

请搂主帮忙解释下,
createAlias("tags","t")
Expression.eq("t.tagClass",tagClass)
怎么理解阿,尤其是t.tagClass
t值得就是那个set是吗?可是这个set怎么有了tagClass属性了?

请帮忙,我这块实在理解不了
hehaorome 2006-11-03
  • 打赏
  • 举报
回复
帮顶
jolestar 2006-11-02
  • 打赏
  • 举报
回复
还有一个问题。也一并提出。
如果我要解除Article和Tag之间的关联,是否非得加载Article的tags Set,然后从Set中remove,然后再update?
有没有办法直接将而者关联表中的字段删除,而不用加载。hql怎么写?
hbwhwang 2006-11-02
  • 打赏
  • 举报
回复
sorry,写错了。
我不对你用relationship mapping发表意见。我只说说如果我会怎么做。
表:
article(id)
tag(id,tagclassid)
tagclass(id)
再加一个表述article与tag的关系表:articetag(articleid,tagid)

做4个POJO,对应4个表
select a from Article a,TagClass tc,Tag t,ArticlTag at
where
at.articleid=a.id and at.tagid=t.id and
t.tagclassid=tc.id and
tc.id=:tagclass.id

你可能认为写这个HQL麻烦,
不过我要告诉你,你用这点麻烦换取了更大灵活性和更好的控制性,是非常值得的。
jolestar 2006-11-02
  • 打赏
  • 举报
回复
老大,这个sql语句会把所有的Article都搜索出来吧。因为你在where中没有对article做限制,更本没有用到Article到Tag的多对多映射表。

这个问题我是这样解决的。
Criteria criteria = this.getSession().createCriteria(Article.class)
.createAlias("tags","t")
.add(Expression.eq("t.tagClass",tagClass));
return criteria.list();

用hibernate时,老感觉以前那种用直接用sql的思维改不过来,只要换一下思维,用面对对象的方式去思考,才能真正体会到hibernate的好处。
hbwhwang 2006-11-02
  • 打赏
  • 举报
回复
对于Hibernate不熟练的使用者,不要滥用关联关系,里面有太多你无法控制的东西。
最好老老实实地跟表字段建一样的属性。比如Tag定义一个字段tagclassid,存放TagClass的ID值而不是对象。

public List<Article> findArticleByTagClass(TagClass tagClass);
实现这个方法的时候可以这样:
select a from Article a,TagClass tc,Tag t where t.tagclassid=tc.id and
tc.id=:tagclass.id


67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧