1.hibernate如何做关联查询呢
很多人认为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也可以不是数据库里的字段
通过以上可以看出,某一技术我们有时觉得不方便,只是我们还不够了解它,需要我们更多的仔细去探索和挖掘。
2.怎么用HQL语句写级联查询啊
FROM Channel c,Module m,ChannelModule cm
where c.channelId=cm.channelId and m.moduleId=cm.moduleId and c.channelId=:id
看能不能运行,我不有把握。而且Hibernate查出来了也没办法用对象来装东西,因为是三个对象里面的东西。
如果你上面的程序可以运行的话,哪可以用上面的sql来吧。
Hibernate也可以直接用sql来做的。
String sql = "select * from channel c,module m,channel_module cm
where c.channel_id=cm.channel_id and m.module_id=cm.module_id and c.channel_id="+id;
Query query = getSession().createSQLQuery(sql);
return query.list();
出来的结果是对象数组。
//Collectionmodules=null;
你这个定义就不对,因为你查询的都是module表的内容吗?不是吧
3.hibernate的关联查询怎么实现
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优点:不需要建立复杂的持久化类,也不需要建立视图。结果集可以自由定制。
4.hibernate如何做关联查询呢
很多人认为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 s5. 去除重复行select distinct s.age from Student as s6. 综合用法举一个典型的例子:分页。用hibernate分页,现在大多数人还是采用两步去做,第一步统计行数,第二步分页查询(目的是计算出总页数),如果想一步完成,多数人还是用sql了,其实hql也能做到。
select new Student(t.name, t.sex, count(t)) from Sudent t在Student实体类中只要有参数为name, sex, rowCount的构造函数即可,rowCount也可以不是数据库里的字段通过以上可以看出,某一技术我们有时觉得不方便,只是我们还不够了解它,需要我们更多的仔细去探索和挖掘。
5.java框架hibernate如何用hql语句查询多对多关联关系
Query query = session.createQuery(“select s.students from Teacher s where s.name= 'xxx' ”);
List list = query.list();
for (int i=0;i<list.size(); i++)
{
Student stu = (Student)list.get(i);
System.out.println(stu.getName());
}
6.怎么用HQL语句写级联查询啊
FROM Channel c,Module m,ChannelModule cmwhere c.channelId=cm.channelId and m.moduleId=cm.moduleId and c.channelId=:id 看能不能运行,我不有把握。
而且Hibernate查出来了也没办法用对象来装东西,因为是三个对象里面的东西。如果你上面的程序可以运行的话,哪可以用上面的sql来吧。
Hibernate也可以直接用sql来做的。String sql = "select * from channel c,module m,channel_module cmwhere c.channel_id=cm.channel_id and m.module_id=cm.module_id and c.channel_id="+id;Query query = getSession().createSQLQuery(sql);return query.list();出来的结果是对象数组。
//Collection
转载请注明出处育才学习网 » hql关联查询语句怎么写