hibernate的关联查询怎么实现?

例如有两个oracle中的表,dept和emp,我想查询一deptNo相等的数据,应该怎么查询?我现在也没有这个结果所对应的实体啊。求问应该怎么办??Queryquery... 例如有两个oracle中的表,dept和emp,我想查询一deptNo相等的数据,应该怎么查询?
我现在也没有这个结果所对应的实体啊。求问应该怎么办??
Query query = session.query("from dept d join emp e on d.deptNo=e.deptNo");
我应该怎么处理这个结果??
展开
 我来答
greystar_cn
2018-08-01 · 知道合伙人软件行家
greystar_cn
知道合伙人软件行家
采纳数:16407 获赞数:17260
本人主要从事.NET C#方向的技术开发工作,具有10多年的各类架构开发工作经验。

向TA提问 私信TA
展开全部
很多人认为hibernate一旦涉及到多张表查询就很不方便,只能通过原生sql解决,其实不然,hql语句其实已经比较强大了,基本涵盖了sql的60%的功能。我认为用原生sql的场景应该为以下几点情况:
1. 非常复杂sql(嵌套、临时表、混合语句【update包含select嵌套】)
2. 某数据库(如oracle)特性函数
3. 特殊业务sql,即查询出的结果是某种特殊业务含义,并不是po实体类里的字段。例如:select col_1 as business1, col_2 as business2 from table;(business1并不是table的字段)
除以上特殊需求外,我建议能用hq就用hql,hql最大的优点,除了能自动映射成po实体类,另一个就是跨数据库的通用性,采用hql语句可以轻松将数据库由mysql改为oracle。
hql的基础我就不再叙述了,今天我为大家主要介绍多表之间的关联查询。
1. po之间含有关联关系
public class Student {
...

private Clazz clazz;

get()...
set()...
}
from Student t inner join t.clazz r where t.sex = '男' and r.name = '三班'
这个语句默认情况下,是懒加载的,如果想一并抓取,则语句为:
from Student t inner join fetch t.clazz r where t.sex = '男' and r.name = '三班'
hql同样支持left join和right join等关联查询
2. po之间没有关联关系
public class Student {
...

private String clazzId;

get()...
set()...
}
select t from Studnent t, Clazz r where t.clazzId = r.id and t.sex = '男' and r.name = '三班'
3. 查询部分字段
另外有时我们只需要查询po对象里的部分字段,那么怎么查呢?
select new Student(name, sex) from Student
但需要注意的是,Student实体类中必须要有参数为name,sex的构造函数。
4. 统计函数
支持count()、min()、max()、sum()、avg()等
select avg(s.age) from Student as s
5. 去除重复行
select distinct s.age from Student as s
6. 综合用法
举一个典型的例子:分页。用hibernate分页,现在大多数人还是采用两步去做,第一步统计行数,第二步分页查询(目的是计算出总页数),如果想一步完成,多数人还是用sql了,其实hql也能做到。
select new Student(t.name, t.sex, count(t)) from Sudent t
在Student实体类中只要有参数为name, sex, rowCount的构造函数即可,rowCount也可以不是数据库里的字段

通过以上可以看出,某一技术我们有时觉得不方便,只是我们还不够了解它,需要我们更多的仔细去探索和挖掘。
曹晓山11
推荐于2018-03-26 · 知道合伙人互联网行家
曹晓山11
知道合伙人互联网行家
采纳数:3033 获赞数:52066
毕业南阳理工学院计算机科学与技术专业,本科学位。互联网行业从业3年工作经验,读过编程类相关书籍多本。

向TA提问 私信TA
展开全部

hibernate的关联查询实现方法,比如有存在关联的表A和表B字段分别如下:

A:id,aName,aDesc
B:id,aId,bName,bDesc
希望查询的结果是:A.id,B.id,A.aName,B.bName,B.bDesc
1.按照如下步骤操作:
①创建A和B的hibernate映射,相互不用关联,对应持久化类为APojo和BPojo
②创建结果集的载体CPojo,CPojo只是简单的一个JavaBean不是持久化类,它的属性与查询结果相对应:

public class CPojo {  
    public long aId;  
    public long bId;  
    public String aName;  
    public String bName;  
    public String bDesc;  
      
    public CPojo(long aId, long bId, String aName, String bName, String bDesc) {  
        this.aId = aId;  
        this.bId = bId;  
        this.aName = aName;  
        this.bName = bName;  
        this.bDesc = bDesc;  
    }  
}

2.HQL关联查询语句写法:

Select new com.XXX.CPojo(a.id,b.id,a.aName,b.bName,b.bDesc) from A a,B b where a.id = b.aId

优点:不需要建立复杂的持久化类,也不需要建立视图。结果集可以自由定制。 

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
mikemelon2012
2014-12-31 · TA获得超过3633个赞
知道大有可为答主
回答量:938
采纳率:87%
帮助的人:380万
展开全部
没问题,用你的这个语句加上query.list( ),它返回的还是一个List,而List里的每个条目都是一个Map对象,你用其get("keyName")就能获取到值,这里的keyName仍是原来表的属性名。
追问
请问,有没有什么方法能获取到keyName,不是自已手写。
追答
你可以看看Hibernate的addEntity()方法,它可以把结果集转成对应类型,不行的话用它们的构造函数生成,然后就可以用成员方法了。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式