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());
}

5.Criteria Query (功能和Query类似)

Hibernate学习笔记--Criteria Query :http://demojava.iteye.com/blog/858342

Criteria Query通过面向对象的设计,将数据查询条件封装为一个对象。

简单来说,Criteria Query可以看作是传统SQL的对象化表示,如:

//第五个查询
Criteria criteria=session.createCriteria(Emp.class);
criteria.add(Restrictions.like("did",1));
criteria.add(Restrictions.eq("eage", 30));
//相当于select eid,ename,eage from Emp where did=1 and eage=30
List<Emp> list5=criteria.list();
for(Emp em:list5){
System.out.println(em.getEid()+" "+em.getEname()+em.getEage());
}

本质上是对"select eid,ename,eage from Emp where did=1 and eage=30"的封装。

结果:1 乔峰 30

====

例子:

建表

在数据库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();
}
}
}
}

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

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

    一.HQL的一对多查询 班级(1)->(多)学生 /** * 实现Classes与Student的内连接 * * SELECT c.*,s.* * from classes c INNER JO ...

  2. HIbernate学习笔记5 之 查询

    一.HQL查询 * 按条件查询,条件中写的是属性名,之后在query对象为添加赋值,如: String hql = " from User where uid=?"; Sessio ...

  3. Hibernate学习笔记-Hibernate关系映射

    1. 初识Hibernate——关系映射 http://blog.csdn.net/laner0515/article/details/12905711 2. Hibernate 笔记8 关系映射1( ...

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

    错误1:MappingException: Unknown entity解决方案 http://jingyan.baidu.com/article/e75aca8552761b142edac6cf.h ...

  5. Hibernate学习笔记(二)

    2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...

  6. Hibernate学习笔记(一)

    2016/4/18 19:58:58 Hibernate学习笔记(一) 1.Hibernate框架的概述: 就是一个持久层的ORM框架. ORM:对象关系映射.将Java中实体对象与关系型数据库中表建 ...

  7. J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate())

    J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate())   当我们使用Hibernate进行数据的CRUD操作时,利用模版进行操作不失为一种方法. ...

  8. Hibernate 学习笔记一

    Hibernate 学习笔记一 今天学习了hibernate的一点入门知识,主要是配置domain对象和表的关系映射,hibernate的一些常用的配置,以及对应的一个向数据库插入数据的小例子.期间碰 ...

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

    MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统, ...

随机推荐

  1. 交叉编译环境以及开发板上-/bin/sh: ./hello: not found(使用arm-linux-gcc -static -o 来进行静态编译)

    目标板是S3C2440.至于交叉编译环境的搭建就不多说了,网上很多教程. 搭建好了交叉编译环境后,第一件事就是传说中的”Hello,World!”. 一. 主机编译环节 我使用的系统是ubuntu10 ...

  2. live555的编译及使用

    live555是个流媒体C++开源库,VLC的Meida Player就使用了它的API完成的RTSP客户端,由于VLC的SDK没有提供相关record流到视频文件的API,所以我想用过live555 ...

  3. perl 安装AnyEvent::HTTP

    perl 版本 ActivePerl_5.16.2.msi

  4. 关于百度地图InfoWindow响应自定义布局点击事件

    大概讲解: 在百度地图上显示一个marker,当marker被点击后,显示自定义的View.当自定义的View被点击后,响应不同Button的点击事件.被百度这个infowindo里面的view坑惨了 ...

  5. HDU4432 Sum of Divisors

    涉及知识点: 1. 进制转换. 2. 找因子时注意可以降低复杂度. Sum of divisors Time Limit: 2000/1000 MS (Java/Others)    Memory L ...

  6. HTML5迷你游戏作验证码

    验证码最常见的是各种变形的字符,因为识别程序进化得越来越聪明,验证码也变得越来越难以识别,给用户造成了很多的麻烦和反感. 已经有很多人尝试过各种改进的验证码,比如动画的验证码,做题目的验证码,要回答问 ...

  7. 数据库版本管理工具Flyway(4.0.3)---工作机制(译文)

    How Flyway works The easiest scenario is when you point Flyway to an empty database. 最容易的方案是Flyway指向 ...

  8. superslide2

    标签切换 / 书签切换 / 默认效果 http://www.superslide2.com/demo.html 4个Web前端经典实用值得学习收藏的地图实现模板~ http://www.iteye.c ...

  9. 关于AppStore上传相关问题

    1.电脑本地证书CertificateSigningRequest.certSigningRequest一定要一致(包括开发者证书,尤其是发布证书要一致,否则无法正常上传),此类错误Xcode一般会提 ...

  10. hdu 4940 Destroy Transportation system(水过)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4940 Destroy Transportation system Time Limit: 2000/1 ...