Hibernate支持三种查询方式:HQL查询,Critevia查询及原生SQL查询。
HQL语句中除了Java类和属性的名称外,查询语句对大小写不敏感。
HQL是面向对象的查询语句,在Hibernate提供的各种查询方式中,HQL是使用最广的一种查询方式。
执行HQL语句需要使用Query接口,Query也是Hibernate的核心接口之一,执行HQL的两种常用方法的list( )方法和iterate( )方法。
HQL语句中绑定参数的两种形式:按参数位置绑定和按参数名称绑定。
HQL支持投影查询,灵活的参数查询,分页查询等功能。
可以使用MyEclipse 反向工程生成持久类和映射文件。
Dept.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.happy.entity"> <class name="Dept" table="Dept" schema="t16"> <id name="id" column="deptno"> <generator class="native"></generator> </id> <property name="name" column="name"></property> </class> </hibernate-mapping>
hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <!--根节点--> <hibernate-configuration> <session-factory> <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property> <property name="connection.username">t16</property> <property name="connection.password">t16</property> <!-- SQL dialect SQL方言 --> <property name="dialect"> org.hibernate.dialect.Oracle10gDialect</property> <!-- Enable Hibernate's automatic session context management session和当前线程绑定--> <property name="current_session_context_class">thread</property> <!--打印sql 控制台--> <property name="show_sql">true</property> <!--格式化SQL--> <property name="format_sql">true</property> <!--自动构建表结构 create 先delete表结构 再创建,update直接更新表结构--> <property name="hbm2ddl.auto">update</property> <mapping resource="cn/happy/entity/Dept.hbm.xml"/> </session-factory> </hibernate-configuration>测试类:
public class Test03 { Configuration cfg; Session session; Transaction tx; SessionFactory factory; @Before public void MyBefor(){ //创建配置对象 cfg=new Configuration().configure(); //根据配置对象创建SessionFactory factory=cfg.buildSessionFactory(); //根据SessionFactory去创建Session session=factory.openSession(); //在session创建后开启事务 tx=session.beginTransaction(); } @Test public void loadtest(){ String hql="from Dept"; Query query= session.createQuery(hql); List<Dept> list=query.list(); for (Dept cat:list) { System.out.println(cat.getName()); } } //检索 不分列 @Test public void selectSomeColumsFromTable(){ String hql="select dept.id,dept.name from cn.happy.entity.Dept dept"; Query query=session.createQuery(hql); List<Object[]> list=query.list(); for (Object[] objects:list){ for (Object child:objects){ System.out.println(child); } } } //检索 不分列 返回的是Dept而不是一个Object[] @Test public void selectSomeColumnsFromTableStrongType(){ String hql="select new Dept(dept.id,dept.name) from cn.happy.entity.Dept dept"; Query query=session.createQuery(hql); List<Dept> list=query.list(); for (Dept dept:list) { System.out.println(dept.getName()); } } //检索 名称为“开发部”部门集合 @Test public void selectSomeRecordFromTable(){ String hql="from Dept dept where dept.name='开发部'"; Query query=session.createQuery(hql); List<Dept> list=query.list(); for (Dept dept:list) { System.out.println(dept.getName()); } } //参数查询:方案三:name 参数名称绑定 + 对象属性 @Test public void selctByConditionParernameAndjectObjectArritbute(){ String hql="from Dept where name=name"; Dept d=new Dept(); d.setName("开发部"); Query query=session.createQuery(hql); query.setProperties(d); List<Dept> list=query.list(); for (Dept dept:list) { System.out.println(dept.getName()); } } //参数查询 :方案二:name 参数名称绑定 @Test public void selectByConditionParametername(){ String hql="from Dept where name=:name"; Query query=session.createQuery(hql); query.setParameter("name","开发部"); List<Dept> list=query.list(); for (Dept dept:list) { System.out.println(dept.getName()); } } //参数查询:方案一:?匿名占位符 @Test public void selectByConditionNiming(){ String hql="from Dept where name=?"; Query query=session.createQuery(hql); query.setParameter(0,"开发部"); List<Dept> list=query.list(); for (Dept dept:list) { System.out.println(dept.getName()); } }}