HQL多表查询

HQL多表查询,第1张

SQL语句:select * from t_user t, linkman l where t.name= l.name

hql语句:from t_user t inner join t.setLinkMan

Query query = session.createQuery("from t_user t inner join t.setLinkMan)

List list = query.list()//返回list ,list里面每部分是数组形式

(1)迫切内连接和内连接底层实现一样

(2)区别:使用内连接返回list每部分是数组,使用迫切内连接返回list每部分是对象

HQL语句:from t_user t inner join fetch c.setLinkMan

SQL语句:select * from t_user t left outer join linkman l on t.name=l.name

HQL语句:from t_user t left outer join t.setLinkMan

HQL语句:from t_user t left outer join fetch t.setLinkMan

注意:左外连接返回list每部分是数组,迫切左外连接list每部分是对象

SQL语句:select * from t_user t right outer join linkman l on t.name=l.name

HQL语句:from t_user t right outer join  t.setLinkMan

hql="selects.id,s.name,t.id,t.namefromUsers,Useraddresstwheret.id=s.id"这条sql里面的User和Useraddress是两个实体类,现在组合查询分别取出来两个实体类里面的两个字段,然后我想再建立一个实体类Result,里面定义这四个结果集里面的字段,能不能执行完这条hql,正好把这个结果集对应到实体类Result里面呢,Result这个实体类,没写映射文件Result.hbm.xml.希望能帮下忙2种做法创建一个classtemp有属性sid,name,tid,sname,tname创建一个构造函数publictemp(sid,name,tid,sname,tname){}1.hql中Listselectnewtemp(s.id,s.name,t.id,t.name)fromUsers,Useraddresstwheret.id=s.id2.List记录的每一行是object[]遍历object[0]==s.idobject[1]==s.nameobject[2]==t.idobject[3]==t.name感谢glamey兄弟的文章,正好解决了当前遇到的问题。原文链接如下:/blog/721019假设我们现在有一个DTO,其属性包括两张表的属性,我们现在需要将sql语句查询得到的内容转为一个DTO对象,其解决方法如下:Stringsql="selectu.userNameasuserName,p.titleastitle,p.addTimeasaddTimefromuserasu,postaspwhereu.id=p.userId"Queryq=factory.getCurrentSession().createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(PostVO.class))上面select中as后面的内容必须和PostVO中属性名一致,这样就可以返回一个针对PostVO的一个集合。其实大家可以看下hibernate这一部分的源码就会发现,主要是使用了AliasToBeanResultTransformer这个类,通过sql的查询,会返回数组,然后hibernate根据数据表的映射,自动帮我们来set对应的字段属性,所以标红的部分务必要跟VO中的属性值一直,要不然会报错的。如果需要的话,大家也可以重写这个类。例如VOResultTransformer。然后在dao中更改成:setResultTransformer(newVOResultTransformer(PostVO.class))另外,除了以上glamey的方法外,还有一种方法:Queryq=session.createQuery("selectnewcom.hibernate.MsgInfo(m.id,m.cont,m.topic.title,m.topic.category.name)fromMsgm")Listlist=q.list()其中,MsgInfo是DTO。值得注意的是,第二种方法中DTO必须提供带参数的构造方法,并且HQL语句中属性的位置要与构造方法中的位置一一对应。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11947452.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-19
下一篇2023-05-19

发表评论

登录后才能评论

评论列表(0条)

    保存