hibernate 多表关联查询 HQL 查询语句?

bluetata
云计算领域优质创作者
博客专家认证
2013-04-12 08:44:36
查询出 A表的 ID 和 NAME
查询出 B表的所有字段
查询出 C表的 salary

该三个表都通过 ID 关联

A表的主键是 ID
B表的主键是 ID 和修改时间
C表的主键是 ID 和 修改时间 和修改次数

求写一条 HQL语句?
我几点不理解的地方 求大神指点。有道理即给分

多表关联的时候hbm.xml关联的时候而且多主键的时候应该怎么处理,注意哪里
可以直接用A表的 ID many-to-one其他两个表的ID吗?

hql查询出来的结果 怎么接收呢。
接收的这个对象要把查询出来的三个表的字段全部加一起new个新class么?

有道理即给分 谢谢


...全文
58056 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
丶努力成长 2015-09-15
  • 打赏
  • 举报
回复
我的是什么错 求高手指点 org.hibernate.hql.ast.QuerySyntaxException: unexpected token: * near line 1, column 8 [select * from (from com.entity.Student where dorm_id = some( select id from com.entity.Dorm where dormitory_id = ?)) t where 1=1 and name like ?]
xuanroot 2014-09-04
  • 打赏
  • 举报
回复
让集团发邮件过来吧
hyper2000 2013-10-04
  • 打赏
  • 举报
回复
参考下下面的语句吧,大体上和SQL类似
select 
         
student0_.id as id1_0_,          
course2_.id as id4_1_,          
student0_.Sno as Sno1_0_,          
student0_.Sname as Sname1_0_,          
student0_.Sdept as Sdept1_0_, 
student0_.Sage as Sage1_0_,          
student0_.Ssex as Ssex1_0_,          
student0_.Saddress as Saddress1_0_,          
course2_.Cno as Cno4_1_,          
course2_.Cname as Cname4_1_,          
course2_.Ccredit as Ccredit4_1_     
from 
         
joblog.student student0_     
left outer join          
sc course1_ 
              
on student0_.id=course1_.sno     
left outer join 
         
joblog.course course2_ 
              
on course1_.cno=course2_.id     where 
        
 student0_.Sname='李XXX'
attach_finance 2013-04-22
  • 打赏
  • 举报
回复
如果实在不行,试试session.createSQLQuery("sql语句")
attach_finance 2013-04-22
  • 打赏
  • 举报
回复
好久没逛论坛了,一看好多问题。。 如果要实现你那种要求的话,我感觉直接在hql里面写最简单的就行了,比如下面的例子
//当不是查询全字段,或者是从两张表中联合查询数据时,返回的是一个数组:

        Session session = HibernateSessionFactory.getSession();

 

        Query query = session.createQuery("select a.id,b.title,b.username from A as a,B b");
        //这里的A,B依然是对象
        List list = query.list();//这里每一行都是一个1维数组

        for(int i=0;i<list.size();i++)

        {

            Object []o = (Object[])list.get(i);  //转型为数组

            int id = (Integer)o[0];  //和select中顺序的类型相对应,可以是类

            String title = (String)o[1];

            String username = (String)o[2];

            System.out.println("id:"+id+" , "+"title"+title+" , "+username);

        }

        HibernateSessionFactory.closeSession();

 
查询结果集的大小 (Integer)session.createQuery("select count(*) from User").iterate().next(); 不知道可不可以帮助你,要是还是不行,恕老夫无能为力了。。。。
bluetata 2013-04-13
  • 打赏
  • 举报
回复
引用 8 楼 hnsy_ys 的回复:
引用 4 楼 dietime1943 的回复: 引用 2 楼 real_tecent 的回复:使用联合抓取,如果三张表有联系 比如A B C ,B中含A的外键 C中含B的外键 hql比如:from C c join fech c.bb b join fetch b.aa a where a.id=1 如果是结果是一条记录的话,就用C c来接收 如果是多条的话,就用List<……
这条hql语句就是查询出 A,BC表的所有数据了吗?
attach_finance 2013-04-12
  • 打赏
  • 举报
回复
<class name="" table="busin_name" > 
 <composite-id name="comp_id" class="po的名称"> 
 <key-property name="id" column="id" type="java.lang.Long" length="10" /> 
 <key-property name="business_id" column="business_id" type="java.lang.Long" length="10" /> 
 </composite-id> 
 <many-to-one name="a" class="a" update="false" insert="false" > 
 <column name="id " /> 
 </many-to-one> 
 <many-to-one name="b" class="b" update="false" insert="false" > 
 <column name="business_ID" /> 
 </many-to-one> 
 </class>
一个小范例,联合主键的写法
attach_finance 2013-04-12
  • 打赏
  • 举报
回复
使用联合抓取,如果三张表有联系 比如A B C ,B中含A的外键 C中含B的外键 hql比如:from C c join fech c.bb b join fetch b.aa a where a.id=1 如果是结果是一条记录的话,就用C c来接收 如果是多条的话,就用List<C>来接收。
troy_211 2013-04-12
  • 打赏
  • 举报
回复
你只要配置好了a表和其他两个表的关系,然后直接查询a表就可以获得关联的所有数据。没有你想象的那么复杂,你应该是没有理解hibernate的作用,建议你去找一个例子来做一下比较容易理解
十年彩虹 2013-04-12
  • 打赏
  • 举报
回复
用原生SQL行吗
喜欢送 2013-04-12
  • 打赏
  • 举报
回复
引用 4 楼 dietime1943 的回复:
引用 2 楼 real_tecent 的回复:使用联合抓取,如果三张表有联系 比如A B C ,B中含A的外键 C中含B的外键 hql比如:from C c join fech c.bb b join fetch b.aa a where a.id=1 如果是结果是一条记录的话,就用C c来接收 如果是多条的话,就用List<C>来接收。 ……
人家写的不就是hql吗
bluetata 2013-04-12
  • 打赏
  • 举报
回复
引用 6 楼 real_tecent 的回复:
引用 4 楼 dietime1943 的回复: 引用 2 楼 real_tecent 的回复:使用联合抓取,如果三张表有联系 比如A B C ,B中含A的外键 C中含B的外键 hql比如:from C c join fech c.bb b join fetch b.aa a where a.id=1 如果是结果是一条记录的话,就用C c来接收 如果是多条的话,就用List<……
我理解你的意思了,还有个不是很清楚的地方 如果是多表的话 select new( A.ID,A.NAME,B.salary c.xxx,c.xxxx...).... 是不是要在pojo中写个新的class其中包括所有查询中的所有字段呢 只能这么写么?
attach_finance 2013-04-12
  • 打赏
  • 举报
回复
引用 4 楼 dietime1943 的回复:
引用 2 楼 real_tecent 的回复:使用联合抓取,如果三张表有联系 比如A B C ,B中含A的外键 C中含B的外键 hql比如:from C c join fech c.bb b join fetch b.aa a where a.id=1 如果是结果是一条记录的话,就用C c来接收 如果是多条的话,就用List<C>来接收。 ……
Hibernate HQL 查询POJO部分字段 在使用Hibernate的时候,有时候并不想将对象的所有字段都查询出来,尤其是对象在数据库中的数据比较大时,(比如存储一些图片或者二进制文件,因为特殊的业务需求,必须这样存),在使用对象的时候,并不是用这些lob字段,就不想将这些字段一起查询出来,可以在domain域的对象中加上想查询字段的构造函数,然后hql语句使用select new Object(构造字段) from Object where 条件; 注意,在查询时,在from 后加上 from User as u,在构造函数中使用 u.name,u.等等。条件语句也是。 public class User(){ String id; String name; String age; String image; public User(String id,String name,String age){ this.id = id; ... } } 如果只想查询部分字段,HQL语句这样写: String hql = "select new User(u.id,u.name,u.age) from User as u where u.id = ?";
onlyyou67 2013-04-12
  • 打赏
  • 举报
回复
查询部分字段的话可以在select * from table 在select 和 from 之间列出你要的字段就可以
bluetata 2013-04-12
  • 打赏
  • 举报
回复
引用 2 楼 real_tecent 的回复:
使用联合抓取,如果三张表有联系 比如A B C ,B中含A的外键 C中含B的外键 hql比如:from C c join fech c.bb b join fetch b.aa a where a.id=1 如果是结果是一条记录的话,就用C c来接收 如果是多条的话,就用List<C>来接收。
请问HQL 应该如何书写呢。查询 一个表的所有数据和另一个表的部分字段

67,550

社区成员

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

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