89-----hibernate的hql查询,原生SQL查询,命名查询,投影查询

原创 2016年05月31日 19:16:05

HQL是Hibernate Query Language即Hibernate查询语言



HQL(Hibernate Query Language)是面向对象的查询语句
执行HQL语句可以采用两种方式:
list()方法
iterator()方法
HQL语句中绑定参数的形式有两种:
按参数位置绑定
按参数名字绑定
HQL支持投影查询、参数查询、分页查询等功能。




查询所有部门:from Dept



HQL语法举例:



from cn.jbit.hibernatdemo.entity.Dept


select dept from Dept as dept


from Dept where deptName = 'SALES' 


from Dept dept where dept.location is not null


from Emp order by hireDate,salary desc




执行HQL语句的步骤:

获取Session对象
编写HQL语句;
创建Query对象;
执行查询,得到查询结果。
session = sessionFactory.openSession();
String hql = "from Emp";
Query query = session.createQuery(hql);
List<Emp> empList = query.list();



HQL查询语句

在HQL查询语句中绑定参数:String hql = "from User where name ='" + name + "'";
在HQL查询方法二:from Emp where  job like ? and  ename=:n
query.setParameter("n", name);query.setParameter(0, "%保洁%");




HQL投影查询是查询一个持久化类的一个或多个属性值

将每条查询结果封装成Object对象
将每条查询结果封装成Object数组
将每条查询结果通过构造函数封装成对象

//投影查询方法1:直接使用select 属性  from 类名的方式查询

public void list1(){
Session session = HibernateSessionFactory.getSessionFactory().getCurrentSession();
//开启事务
Transaction tx = session.beginTransaction();
Query query = session.createQuery("select name,title from Guestbook");
List<Object[]> list = query.list();
for(Object[] o:list){
System.out.println("姓名:"+o[0]);
}
tx.commit();
}

/*
 * 投影查询方法2  ---   使用select new 类名(属性名...) from 类名的方式,返回实体类
 * 注意:如何使用实体类的方式,那么必须在实体类中有这样的构造方法
 */

public void list2(){
Session session = HibernateSessionFactory.getSessionFactory().getCurrentSession();
//开启事务
Transaction tx = session.beginTransaction();
Query query = session.createQuery("select new Guestbook(id,name,title) from Guestbook");
List<Guestbook> list = query.list();
for(Guestbook gb:list){
System.out.println("编号:"+gb.getId()+",姓名:"+gb.getName()+",标题:"+gb.getTitle());
}
tx.commit();
}

/*
 * 投影查询方法3  ---   使用select new Map(属性名...) from 类名的方式,返回Map集合,通过下标获取属性值
 * 注意:如何使用实体类的方式,那么必须在实体类中有这样的构造方法
 */

public void list3(){
Session session = HibernateSessionFactory.getSessionFactory().getCurrentSession();
//开启事务
Transaction tx = session.beginTransaction();
//在遍历Map是就可以根据编号获取属性值
//Query query = session.createQuery("select new Map(id,name,title) from Guestbook");
//使用属性的别名,在遍历Map是就可以根据名称获取属性值
Query query = session.createQuery("select new Map(gb.id as id,gb.name as name,gb.title as title) from Guestbook gb");
List<Map> list = query.list();
for(Map m:list){
//注意:这里的编号不是Integer类型,而是String类型
System.out.println("编号:"+m.get("id")+",姓名:"+m.get("name")+",标题:"+m.get("title"));
}
tx.commit();
}


分页查询:

uniqueResult()方法:获取唯一对象
setFirstResult()方法:设置从第几条开始
setMaxResults()方法:设置读取最大记录数


String countHQL = "select count(*) from Dept";
int count =  ((Long)session.createQuery(countHQL)
.uniqueResult()).intValue();
int totalpages = (count % pageSize == 0) 
? (count / pageSize) : (count / pageSize + 1);
int pageIndex = 1;
query.setFirstResult((pageIndex - 1) * pageSize);


query.setMaxResults(pageSize);




List<Dept> deptList = query.list();



一、      子查询语句应用在HQL查询语句的where子句中

all 返回的所有记录
any 返回的任意一条记录
some 和“any”意思相同
in 与“=any”意思相同
exists 至少返回一条记录 



 查询工资高于平均工资的员工。

"fromEmp ewheree.salary>(selectavg(salary)fromEmp)"

查询所有员工工资都小于5000的部门。

"fromDept dwhere 5000>all(selecte.salary fromd.emps e) andd.emps.size>0"

查询至少有一位员工工资低于5000的部门。

"fromDept dwhere 5000>any(selecte.salary fromd.emps e)"

查询至少有一位员工的部门

"fromDept dwhere exists (fromd.emps)"

查询员工工资正好是5000元的部门

"fromDept dwhere 5000 in (selecte.salary fromd.emps e)"

"fromDept dwhere 5000=some(selecte.salary fromd.emps e)"

"fromDept dwhere 5000=any(selecte.salary fromd.emps e)"

查询指定员工所在部门

"fromDeptd where ? in (fromd.emps)"

"fromDeptd where ? in elements (d.emps)"

查询员工个数大于5的部门

"fromDeptd where d.emps.size>5"

"fromDeptd where  size(d.emps)>5"

二、      聚合函数

  count() 统计记录条数
sum() 求和
max() 求最大值
min() 求最小值
avg() 求平均值

 


按职位统计员工个数。select job,count(*)from Employee group by job

统计各个部门的平均工资  select e.dept.dname,avg(sal)from Employee egroup by e.dept.dname

 统计各个职位的最低工资和最高工资 selecte.job,max(sal),min(sal)from Employee e group by e.job

统计各个部门平均工资高于4000元的部门名称,打印部门名称、部门平均工资 

selecte.dept.dname,avg(sal)from Employee e group by e.dept.dname havingavg(sal)>2000

统计各个部门平均工资高于4000元的部门名称,打印部门名称、部门平均工资,使用JavaBean封装查询结果


 


三、      相关例子

    

查询有50条以上房屋信息的街道。

查询所有房屋信息的租金高于2000元的的街道。

查询至少有一条房屋信息的租金低于1000元的街道。

统计各个街道的房屋信息条数。

 

fromStreet s where 50<(select count(h) froms.houses h)

fromStreet s where 2000<all(selecth.price froms.houses h) ands.houses.size>0

fromStreet s where 1000> any (selecth.price froms.houses h)

selects.name,s.houses.size from Street s 

 

四、      HQL的连接查询

 




使用隐式内连接查询某用户发布的房屋信息 (提示:from House h where h.user.uname = 'rose')




连接类型 HQL语法
内连接        inner join 或 join
迫切内连接 inner join fetch或 join fetch
左外连接 left outer join或 left join
迫切左外连接 left outer join fetch或 left join fetch
右外连接 right outer join 或right join


HQL使用group by关键字对数据分组,用having关键字对分组数据设定约束条件

Hibernate可以在映射文件中定义字符串形式的查询语句

Hibernate使用Session的createSQLQuery()方法创建SQLQuery对象,用来执行原生SQL语句

在持久化类中,二进制大对象可以声明为byte[]或java.sql.Blob类型;字符串大对象可以声明为java.lang.String或java.sql.Clob类型


 

五、      原生SQL查询

     
Query query = session
    .createSQLQuery(
       "select * from EMP where ENAME like :ename and JOB = :job")
    .addEntity(Emp.class).setString("ename", "%e%")
    .setString("job", "ENGINEER");
List<Emp> list = query.list();

 

 

String sql = "select {e.*},{d.*} from EMP e join DEPT d on d.DEPTNO=e.DEPTNO"+ " where e.JOB = :job";
Query query = session.createSQLQuery(sql).addEntity("e", Emp.class).addJoin("d", "e.dept").setString("job", "ENGINEER");


   <sql-query name="selectEmpByJob">

    	<return alias="e" class="cn.jbit.hibernatedemo.entity.Emp"/>

    	select {e.*} from EMP e where e.job = :job

    </sql-query>

    <sql-query name="selectEmpByJobJoinDept">

    	<return alias="e" class="cn.jbit.hibernatedemo.entity.Emp"/>

    	<return-join alias="d" property="e.dept"></return-join>

    	select {e.*},{d.*} from EMP e join DEPT d on d.DEPTNO=e.DEPTNO where e.JOB = :job

    </sql-query>

六、      命名查询

    
<hibernate-mapping>
    <class name="cn.jbit.hibernatedemo.entity.Emp" table="emp">
        ......
    </class>
    <sql-query name="selectEmpByJob">
            <return alias="e" class="cn.jbit.hibernatedemo.entity.Emp"/>
        select {e.*} from EMP e where e.job = :job
    </sql-query>
</hibernate-mapping>

 

<hibernate-mapping>
    <class name="cn.jbit.hibernatedemo.entity.Emp" table="emp">
        ......
    </class>
    <query name="findEmpByJob">
    <![CDATA[
        from Emp e where e.job = :job
    ]]>
    </query>
</hibernate-mapping>

 

原生sql查询

SQLQuerysession.createSQLQuery("sql");

命名查询

映射文件

根标签下<queryname="N"><![CDATA[Hql]]>

session.getNamedQuery("N");

原生sql命名查询

映射文件

根标签下<sql-queryname="N"><return class=""/>sql</>

session.getNamedQuery("N");


 

 

八、      

 

 


相关文章推荐

Hibernate高级查询方法(内含hibernate迫切左外连接检索策略)

投影查询——过滤部分字段 返回的List集合元素为Object[] Query query = session.createQuery("select c.cname, c.csex from C...

Hibernate投影查询

在一般的增删改查中我们有时候不需要查询一个类的所以属性,我们仅仅需要部分属性。如果是全部查询将会非常浪费你的时间(确切是客户的时间)。因此投影查询在Hibernate中应运而生。我们还是用例子来说明问...

Hibernate— 投影查询

我们知道Hibernate框架是ORM(持久层)类型框架,所以有很多数据库优化方式,比如缓存等等,当我们只有查询出某个对象中的1,2个属性时,如果使用HQL的方式的查询,你将会是查询该对象的全部属性!...

Hibernate-Criteria查询(2)动态查询、排序、分页、连接查询、投影查询、聚合函数

package junit.test;import static org.junit.Assert.*;import java.text.ParseException; import java.tex...

Hibernate关于查询Timestamp字段总结

之前在Mysql中做条件查询遇到点问题,经过科普以后,总结对Timestamp使用遇到的问题,希望对大家有帮助。 1. 如何查询某一天的数据? 解决的办法有很多种,我说一种我的做法,算是比较简单的...

Hibernate HQL timestamp 日期查询比较

Hibernate HQL timestamp 日期查询比较方法

Hibernate SQLQuery 原生SQL 查询及返回结果集处理-1

第一篇:官方文档的处理方法,摘自官方 在迁移原先用JDBC/SQL实现的系统,难免需要采用hibernat native sql支持。 1.使用SQLQuery hibern...

Hibernate原生SQL查询

Hibernate除了支持HQL查询外,还支持原生SQL查询。          对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()...

Hibernate中使用原生的sql语句进行查询操作

1.  在Hibernate中使用原生的sql语句进行查询操作 2.  使用HQL查询的一般步骤 2.1 一般的用法 addEntity(Student.class)将查询结果转换为实体类 St...

Hibernate原生SQL查询多表关联,SQL语句要注意的问题

Hibernate原生SQL查询多表关联,SQL语句要注意的问题@for&ever 2009-9-4 系统环境:MySQL5.1Hibernate3.3 有如下的假定:实体类 Question 和 A...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:89-----hibernate的hql查询,原生SQL查询,命名查询,投影查询
举报原因:
原因补充:

(最多只允许输入30个字)