两个简单的表,  Newtype 新闻类型, news 新闻 一对多双向关系 HQL如下 String hql = " select s from Newtype s inner join s.news n where n.id=? ";
Query query = session.getSession().createQuery(hql);
query.setInteger(0,1); 
List list = query.list();
for(int i=0;i<list.size();i++){
Newtype type = (Newtype)list.get(i);
System.out.println(type.getTypes());
} 现在只可以通过 主表也就是类型表 来获取, 但如果改为这样
for(int i=0;i<list.size();i++){
News news = (News)list.get(i);
System.out.println(news.getTitle());
}就会出现异常Exception in thread "main" java.lang.ClassCastException: pojo.Newtype cannot be cast to pojo.News
at main.Test.CreateHqlh(Test.java:65)
at main.Test.main(Test.java:22)
现在关系是双向的,我请问下,如何News表也能直接读取出数据?hbml:
类型表
<set name="news" cascade="all" outer-join="true" inverse="true">
<key column="typeid"></key>
<one-to-many class="pojo.News"></one-to-many>
</set>新闻表
<many-to-one name="newtype" column="typeid" insert="false"
update="false" class="pojo.Newtype"></many-to-one>

解决方案 »

  1.   


    Set news = Newtype.getNews();
    然后循环
      

  2.   

    第二段Java code中,list中的对象类型为NewsType,转换为News的时候,出现了java.lang.ClassCastException
      

  3.   


    如果这样,
    SessionFactorys session = new SessionFactorys();
    String hql = " select s from Newtype s inner join s.news n where n.id=? ";
    Query query = session.getSession().createQuery(hql);
    query.setInteger(0,10); 
    List list = query.list(); 
    for(int i=0;i<list.size();i++){
    Newtype type = (Newtype)list.get(i);
    Set set = type.getNews();
    Iterator or = set.iterator();
    while(or.hasNext()){
    News news = (News)or.next();
    System.out.println(news.getTitle());
    }
    }
    }就会有两条Hibernate: select newtype0_.id as id0_, newtype0_.types as types0_ from hibernate.newtype newtype0_ inner join hibernate.news news1_ on newtype0_.id=news1_.typeid where news1_.id=?
    Hibernate: select news0_.typeid as typeid1_, news0_.id as id1_, news0_.id as id1_0_, news0_.title as title1_0_, news0_.typeid as typeid1_0_ from hibernate.news news0_ where news0_.typeid=?怎么缩到一条语句呢?
      

  4.   

    这是hibernate的查询策略lz的应该场景是如何的,最好说的清晰些
      

  5.   

    你查出来的是Newstype 其中包含一个set是news
      

  6.   

    正解
    没法子hibernate是这样实现的,如果要你自己写也要多条sql才能得到你想要的,你说对不?
      

  7.   

    你查出来的是Newstype 其中包含一个set是news
      

  8.   

      我慢慢看了章 孙卫勤的 那个书, 解决了, 也可以只显示一条sql语句 但要改为 左外抓取链接代码如下 String left_hql = "select s from Newtype s left join fetch s.news n where s.id=?";
    Query query = session.getSession().createQuery(left_hql);
    query.setInteger(0,1); 
    List list = query.list(); 
    for(int i=0;i<list.size();i++){
    Newtype type = (Newtype)list.get(i);
    System.out.println(type.getTypes());
    Iterator or = type.getNews().iterator();
    while(or.hasNext()){
    News news = (News)or.next();
    System.out.println(news.getTitle());
    }
    }
    }
      

  9.   

    String left_hql = "select s from Newtype s left join fetch s.news n where s.id=?";
    你的映射文件已经配置了,为何还这么写HQL?