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");
我应该怎么处理这个结果?? 展开
我现在也没有这个结果所对应的实体啊。求问应该怎么办??
Query query = session.query("from dept d join emp e on d.deptNo=e.deptNo");
我应该怎么处理这个结果?? 展开
2018-08-01 · 知道合伙人软件行家
关注
展开全部
很多人认为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也可以不是数据库里的字段
通过以上可以看出,某一技术我们有时觉得不方便,只是我们还不够了解它,需要我们更多的仔细去探索和挖掘。
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也可以不是数据库里的字段
通过以上可以看出,某一技术我们有时觉得不方便,只是我们还不够了解它,需要我们更多的仔细去探索和挖掘。
推荐于2018-03-26 · 知道合伙人互联网行家
关注
展开全部
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
优点:不需要建立复杂的持久化类,也不需要建立视图。结果集可以自由定制。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
没问题,用你的这个语句加上query.list( ),它返回的还是一个List,而List里的每个条目都是一个Map对象,你用其get("keyName")就能获取到值,这里的keyName仍是原来表的属性名。
追问
请问,有没有什么方法能获取到keyName,不是自已手写。
追答
你可以看看Hibernate的addEntity()方法,它可以把结果集转成对应类型,不行的话用它们的构造函数生成,然后就可以用成员方法了。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询