Java学习笔记-Hibernate HQL查询

Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存、更新、查找数据。
session是Hibernate运作的中心,对象的生命周期、事务的管理、数据库的存取都与Session有关
Session由SessionFactory创建,是线程安全的Thread-Safe,可以让多个线程同时存取SessionFactory
而不会有数据共享的问题

Hibernate中Session的解释 :http://blog.csdn.net/shrek_xu/article/details/740991
Hibernate 笔记 HQL查询(一)单属性,多属性查询 : http://www.cnblogs.com/zilong882008/archive/2011/11/05/2237123.html

1. hql的查询应用:

hibernate的session.createQuery()方法是使用HQL语句查询对象的。

hql:是查询对象的,例如:"from User",其中from不区分大小写,而User区分大小写,因为它是对象。是User类
返回Query对象。
执行这条语句后,Hibernate会根据配置文件中所配置的数据库适配器自动生成相应数据库的SQL语句。

sql: select * from dept; from 后面是表名
hql: form Dept; from 后面是

可以对类起别名,有两种方法。
hql: from Dept d
hql:from Dept as d

2. 查询表中单个属性
sql: select ename from dept
hql: select ename from Dept

对属性也可以设置别名
hql:select ename as from Dept
as 必须加。

3. 多属性查询

sql: select ename,eage from emp
hql: select ename,eage from Emp
hql: select e.ename,e.eage from Emp e

注意:对多个属性查询的时候,使用Obejct数组。

 //第三个查询:对多属性查询
Query query3=session.createQuery("select ename,eage from Emp");
List<Object[]> list3 = query3.list();
//对多个属性查询的时候,使用Obejct数组。
for(Object[] message:list3){
    //采用辅助类Arrays的toString()方法打印数组。
    System.out.println(Arrays.toString(message));
}  

4. 通过实体类方式查询多属性

除了上述方法外,还可以采用实体类的方式查询,要在Emp类中加入带有查询参数的构造器,代码如下。

public class Emp {
   private int eid;
   private int eage;
   private float esal;
   private String ename;
   省略get,set方法。

public Emp() {
    super();
}
public Emp(int eage, String ename) {    //需要查询的属性是什么,构造器的参数就是什么。
    super();
    this.eage = eage;
    this.ename = ename;
}

查询代码:

Query query=session.createQuery("select new Emp(eage,ename) from Emp e");    //select 后直接调用构造器,参数就是查询的属性,参数不可错乱。
List<Emp> list = query.list();  //此处不实用object数组,类类型即可
for(Emp message:list){
    System.out.print("姓名:"+message.getEname()+"  ");
    System.out.println("年龄:"+message.getEage());
}

====

例子:

建表

在数据库ztest中建Dept表 在数据库ztest中建Emp表

create table DEPT
(
    DID Integer NOT NULL PRIMARY KEY,
    DNAME VARCHAR(12),
    DADDRESS VARCHAR(12),
)

create table EMP
(
    EID INTEGER NOT NULL PRIMARY KEY,
    ENAME VARCHAR(12),
    EAGE INTEGER,
    ESAL INTEGER,
    DID INTEGER,
)

insert into DEPT values(1,‘业务部‘,‘address101‘)
insert into DEPT values(2,‘技术部‘,‘address201‘)
insert into DEPT values(3,‘管理部‘,‘address301‘)
insert into DEPT values(4,‘财务部‘,‘address401‘)
insert into DEPT values(5,‘人力资源部‘,‘address501‘)

insert into EMP values(1,‘乔峰‘,30,10000,1)
insert into EMP values(2,‘杨过‘,25,15020,2)
insert into EMP values(3,‘郭靖‘,33,23563,1)
insert into EMP values(4,‘周伯通‘,52,32000,3)
insert into EMP values(5,‘东方不败‘,43,12000,3)
insert into EMP values(6,‘任我行‘,44,16000,4)
insert into EMP values(7,‘任盈盈‘,30,22000,4)
insert into EMP values(8,‘李莫愁‘,42,45000,5)
insert into EMP values(9,‘令狐冲‘,35,20000,2)
insert into EMP values(10,‘岳不群‘,50,42000,2)

进行查询

package com.hibernate.hql;

import java.util.Arrays;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class Test {
    public static void main(String[] args){
        try {
            Test1() ;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void Test1() throws Exception{
        Configuration config=new Configuration().configure();
        SessionFactory sessionFactory= config.buildSessionFactory();
        Session session=null;
        Transaction tr=null;
        try{
            session= sessionFactory.openSession();
            tr=session.beginTransaction();

            //第一个查询
            String hql="from Dept"; //定义String类型hql,写入hql语句。
            Query query=session.createQuery(hql);
            List<Dept> list = query.list();                          

            for(Dept dept:list){
                System.out.print("部门编号:  "+dept.getDid() +"   ");
                System.out.println("部门名称:   "+dept.getDname());
            }

            //第二个查询
            String hql2 = "from Emp where eid = 5";
            Query query2 = session.createQuery(hql2);
            List<Emp> list2 = query2.list();
            for(Emp emp:list2){
                System.out.print("员工编号:"+emp.getEid());
                System.out.println("员工姓名:"+emp.getEname());
            }

            //第三个查询:对多属性查询
            Query query3=session.createQuery("select ename,eage from Emp");
            List<Object[]> list3 = query3.list();
            //对多个属性查询的时候,使用Obejct数组。

            for(Object[] message:list3){
                //采用辅助类Arrays的toString()方法打印数组。
                System.out.println(Arrays.toString(message));
            }                                      

            tr.commit();
        }catch(Exception e){
            tr.rollback();
        }finally{
            if(session!=null){
                session.close();
            }
            if(sessionFactory!=null){
                sessionFactory.close();
            }
        }
    }
}
时间: 2025-01-18 07:25:40

Java学习笔记-Hibernate HQL查询的相关文章

Hibernate学习笔记(十) — HQL查询

一.HQL的一对多查询 班级(1)->(多)学生 /** * 实现Classes与Student的内连接 * * SELECT c.*,s.* * from classes c INNER JOIN student s * where (c.cid=s.cid) */ @Test public void testInnerJoin(){ session = HibernateUtils.openSession(); Query query = session.createQuery("fr

Java学习笔记-Hibernate关系映射

1. 初识Hibernate——关系映射 http://blog.csdn.net/laner0515/article/details/12905711 2. Hibernate 笔记8 关系映射1(多对一,一对多): http://www.cnblogs.com/zilong882008/archive/2011/11/05/2236559.html 3. Hibernate关联映射 http://www.cnblogs.com/huxi/archive/2009/12/15/1624988.

Java学习笔记--Hibernate框架错误集合及解决

错误1:MappingException: Unknown entity解决方案 http://jingyan.baidu.com/article/e75aca8552761b142edac6cf.html 错误2:Could not bind factory to JNDI 2006-07-23 23:14:53,796 [main] WARN org.hibernate.impl.SessionFactoryObjectFactory - Could not bind factory to

Hibernate HQL查询:

Hibernate HQL查询:Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装.完整的HQL语句形势如下:Select/update/delete…… from …… where …

MyBatis:学习笔记(3)——关联查询

MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统,如果我们将用户信息和订单信息都保存在user表中,这样就不存在联结关系,因为我们仅仅操作一张表就好. 但是这是非常不明智的选择,举例来说,一个用户可以拥有多个订单,如果保存在一个表中,势必会导致用户信息的多次出现,因为每个订单绑定的用户信息都是相同的. 所以我们尽量要将不同的信息存储与不同的表中,但

Hibernate HQL查询语句总结

Hibernate HQL查询语句总结 1. 实体查询:有关实体查询技术,其实我们在先前已经有多次涉及,比如下面的例子:String hql="from User user ";List list=session.CreateQuery(hql).list();上面的代码执行结果是,查询出User实体对象所对应的所有数据,而且将数据封装成User实体对象,并且放入List中返回.这里需要注意的是,Hibernate的实体查询存在着对继承关系的判定,比如我们前面讨论映射实体继承关系中的E

JAVA学习笔记 -- JDBC及其应用

一.准备工作 1.开启SQL Server服务和启用TCP/IP  并且确认TCP端口 2.Eclipse下给项目导入sqljdbc4.jar包 将下载好的 sqljdbc_4.0.2206.100_chs.exe运行解压.然后在 .\Microsoft JDBC Driver 4.0 for SQL Server\sqljdbc_4.0\chs\auth 路径下选择合适版本的sqljdbc_auth.dll, 将其放在 C:\Windows\System32下. 给项目导入包:右键你的项目选择

JAVA学习笔记 -- 数据结构

一.数据结构的接口 在Java中所有类的鼻祖是Object类,但是所有有关数据结构处理的鼻祖就是Collection和Iterator接口,也就是集合与遍历. 1.Collection接口 Collection c = new Xx(); // c可以称为Collection接口回调对象,虽然它被声明为Collection类型,但是实例化时实现的是接口的实现类Xx.它的方法也是用来操作实现类的对象. <span style="white-space:pre"> </s

java学习笔记 第二篇 核心技术(二)

第十四章 集合类 集合类用来存放对象的引用.继承关系如下图: 14.1 Collection 接口 是层次结构中的根接口,构成Collection的单位称为元素.Collection接口不能直接使用,但该接口提供了添加元素.删除元素.管理数据的方法. Collection接口常用方法: 14.2 List 集合 包括List接口以及List集合的所有实现类.List集合中的元素允许重复,各元素循序就是对象插入的顺序 1.List接口,两个重要方法: get(int index): 获取指定索引位