在hql中关键字不区分大小写,但是属性和类名区分大小写
1、简单属性查询【重要】
    * 单一属性查询,返回结果集属性列表,元素类型和实体类中相应的属性类型一致
    * 多个属性查询,返回的集合元素是对象数组,数组元素的类型和对应的属性在实体类中的类型一致
    数组的长度取决与select中属性的个数
    * 如果认为返回数组不够对象化,可以采用hql动态实例化Student对象
    参见:SimplePropertyQueryTest.java
2、实体对象查询【重要】
    * N + 1问题,在默认情况下,使用query.iterate查询,有可以能出现N+1问题
    所谓的N+1是在查询的时候发出了N+1条sql语句
    1: 首先发出一条查询对象id列表的sql
    N: 根据id列表到缓存中查询,如果缓存中不存在与之匹配的数据,那么会根据id发出相应的sql语句
    * list和iterate的区别?
        * list每次都会发出sql语句,list会向缓存中放入数据,而不利用缓存中的数据
        * iterate:在默认情况下iterate利用缓存数据,但如果缓存中不存在数据有可以能出现N+1问题
    参见:SimpleObjectQueryTest1.java/SimpleObjectQueryTest2.java
   
3、条件查询【重要】   
    * 可以采用拼字符串的方式传递参数
    * 可以采用 ?来传递参数(索引从0开始)
    * 可以采用 :参数名 来传递参数
    * 如果传递多个参数,可以采用setParamterList方法
    * 在hql中可以使用数据库的函数,如:date_format
    参见:SimpleConditionQueryTest.java    
       
4、hibernate也支持直接使用sql进行查询
    参见:SqlQueryTest.java
5、外置命名查询
    * 在映射文件中采用<query>标签来定义hql
    * 在程序中采用session.getNamedQuery()方法得到hql查询串
    参见:Student.hbm.xml、NameQueryTest.java
   
6、查询过滤器   
    * 在映射文件中定义过滤器参数
    * 在类的映射中使用这些参数
    * 在程序中启用过滤器
    参见:Student.hbm.xml、FilterQueryTest.java
   
7、分页查询【重要】   
    * setFirstResult(),从0开始
    * setMaxResults,每页显示多少条数据
    参见:PageQueryTest.java
           
8、对象导航查询,在hql中采用 . 进行导航【重要】
    参见:ObjectNavQueryTest.java
   
9、连接查询【重要】
    * 内连
    * 外连接(左连接/右连接)   
    参见:JoinQueryTest.java
   
10、统计查询【重要】
    参见:StatQueryTest.java
   
11、DML风格的操作(尽量少用,因为和缓存不同步)
    参见:DMLQueryTest.java
Classes.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "[url]http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd[/url]">
<hibernate-mapping package="com.bjsxt.hibernate">
    <class name="Classes" table="t_classes">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
        <set name="students" inverse="true" cascade="all">
            <key column="classesid"/>
            <one-to-many class="Student"/>
        </set>
    </class>
</hibernate-mapping>
Student.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "[url]http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd[/url]">
<hibernate-mapping>
    <class name="com.bjsxt.hibernate.Student" table="t_student">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
        <property name="createTime"/>
        <many-to-one name="classes" column="classesid"/>
        <filter name="filtertest" condition="id &lt; :myid"/>
    </class>
   
    <query name="searchStudents">
        <![CDATA[
            SELECT s FROM Student s where s.id<?
        ]]>
    </query>
   
    <filter-def name="filtertest">
        <filter-param name="myid" type="integer"/>
    </filter-def>  
</hibernate-mapping>
Classes.java
package com.bjsxt.hibernate;
import java.util.Set;
public class Classes {
   
    private int id;
   
    private String name;
   
    private Set students;
   
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Set getStudents() {
        return students;
    }
    public void setStudents(Set students) {
        this.students = students;
    }
   
}
Student.java
package com.bjsxt.hibernate;
import java.util.Date;
public class Student {
   
    private int id;
   
    private String name;
   
    private Date createTime;
   
    private Classes classes;
    public Student() {}
   
    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }
   
   
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Classes getClasses() {
        return classes;
    }
    public void setClasses(Classes classes) {
        this.classes = classes;
    }
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
}
DMLQueryTest.java
package com.bjsxt.hibernate;
import org.hibernate.Session;
import junit.framework.TestCase;
/**
* DML风格的操作
* @author Administrator
*
*/
public class DMLQueryTest extends TestCase {
    public void testQuery1() {
        Session session = null;
        try {
            session = HibernateUtils.getSession();
            session.beginTransaction();
           
            session.createQuery("update Student s set s.name=? where s.id < ?")
                    .setParameter(0, "李四")
                    .setParameter(1, 5)
                    .executeUpdate();
           
            session.getTransaction().commit();
        }catch(Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }finally {
            HibernateUtils.closeSession(session);
        }
    }       
}
FilterQueryTest.java
package com.bjsxt.hibernate;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Session;
import junit.framework.TestCase;
/**
* 查询过滤器
* @author Administrator
*
*/
public class FilterQueryTest extends TestCase {
    public void testQuery1() {
        Session session = null;
        try {
            session = HibernateUtils.getSession();
            session.beginTransaction();
           
            session.enableFilter("filtertest")
                    .setParameter("myid", 10);   
           
            List students = session.createQuery("from Student").list();
            for (Iterator iter=students.iterator(); iter.hasNext();) {
                Student student = (Student)iter.next();
                System.out.println(student.getName());
            }
            session.getTransaction().commit();
        }catch(Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }finally {
            HibernateUtils.closeSession(session);
        }
    }   
}
InitData.java
package com.bjsxt.hibernate;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.hibernate.Session;
public class InitData {
    public static void main(String[] args) {
            Session session = HibernateUtils.getSession();
            try {
                session.beginTransaction();
                for(int i=0; i<10; i++){
               
                    Classes classes = new Classes();
                    classes.setName("班级"+i);
                    session.save(classes);
                   
                    for(int j=0; j<10; j++){
                        Student student = new Student();
                        student.setName("班级"+i+"的学生"+j);
                        student.setCreateTime(randomDate("2008-01-01","2008-03-01"));
                       
                        //在内存中建立由student指向classes的引用
                        student.setClasses(classes);
                        session.save(student);
                    }
                }
               
                for(int i=0; i<5; i++){
                    Classes classes = new Classes();
                    classes.setName("无学生班级"+i);
                    session.save(classes);
                }
               
                for(int i=0; i<10; i++){
                    Student student = new Student();
                    student.setName("无业游民"+i);
                    session.save(student);
                }
               
                session.getTransaction().commit();
            } catch (Exception e) {
                e.printStackTrace();
                session.getTransaction().rollback();
            } finally{
                HibernateUtils.closeSession(session);
            }
        }   
       
        /**
        * 获取随机日期
        * @param beginDate 起始日期,格式为:yyyy-MM-dd
        * @param endDate 结束日期,格式为:yyyy-MM-dd
        * @return
        */
        private static Date randomDate(String beginDate,String endDate){
            try {
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                Date start = format.parse(beginDate);
                Date end = format.parse(endDate);
               
                if(start.getTime() >= end.getTime()){
                    return null;
                }
               
                long date = random(start.getTime(),end.getTime());
               
                return new Date(date);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
       
        private static long random(long begin,long end){
            long rtn = begin + (long)(Math.random() * (end - begin));
            if(rtn == begin || rtn == end){
                return random(begin,end);
            }
            return rtn;
        }
}
JoinQueryTest.java
package com.bjsxt.hibernate;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Session;
import junit.framework.TestCase;
/**
* 连接查询
* @author Administrator
*
*/
public class JoinQueryTest extends TestCase {
    public void testQuery1() {
        Session session = null;
        try {
            session = HibernateUtils.getSession();
            session.beginTransaction();
           
            //List students = session.createQuery("select c.name, s.name from Student s join s.classes c").list();
            List students = session.createQuery("select c.name, s.name from Student s inner join s.classes c").list();
            for (Iterator iter=students.iterator(); iter.hasNext();) {
                Object[] obj = (Object[])iter.next();
                System.out.println(obj[0] + "," + obj[1]);
            }
            session.getTransaction().commit();
        }catch(Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }finally {
            HibernateUtils.closeSession(session);
        }
    }
    public void testQuery2() {
        Session session = null;
        try {
            session = HibernateUtils.getSession();
            session.beginTransaction();
            List students = session.createQuery("select c.name, s.name from Classes c left join c.students s").list();
            for (Iterator iter=students.iterator(); iter.hasNext();) {
                Object[] obj = (Object[])iter.next();
                System.out.println(obj[0] + "," + obj[1]);
            }
            session.getTransaction().commit();
        }catch(Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }finally {
            HibernateUtils.closeSession(session);
        }
    }
   
    public void testQuery3() {
        Session session = null;
        try {
            session = HibernateUtils.getSession();
            session.beginTransaction();
            List students = session.createQuery("select c.name, s.name from Classes c right join c.students s").list();
            for (Iterator iter=students.iterator(); iter.hasNext();) {
                Object[] obj = (Object[])iter.next();
                System.out.println(obj[0] + "," + obj[1]);
            }
            session.getTransaction().commit();
        }catch(Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }finally {
            HibernateUtils.closeSession(session);
        }
    }
   
}
NameQueryTest.java
package com.bjsxt.hibernate;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Session;
import junit.framework.TestCase;
/**
* 外置命名查询
* @author Administrator
*
*/
public class NameQueryTest extends TestCase {
    public void testQuery1() {
        Session session = null;
        try {
            session = HibernateUtils.getSession();
            session.beginTransaction();
           
            List students = session.getNamedQuery("searchStudents")
                                .setParameter(0, 10)
                                .list();
            for (Iterator iter=students.iterator(); iter.hasNext();) {
                Student student = (Student)iter.next();
                System.out.println(student.getName());
            }
            session.getTransaction().commit();
        }catch(Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }finally {
            HibernateUtils.closeSession(session);
        }
    }   
}
ObjectNavQueryTest.java
package com.bjsxt.hibernate;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Session;
import junit.framework.TestCase;
/**
* 对象导航查询
* @author Administrator
*
*/
public class ObjectNavQueryTest extends TestCase {
    public void testQuery1() {
        Session session = null;
        try {
            session = HibernateUtils.getSession();
            session.beginTransaction();
           
            List students = session.createQuery("select s.name from Student s where s.classes.name like '%1%'").list();
            for (Iterator iter=students.iterator(); iter.hasNext();) {
                String name = (String)iter.next();
                System.out.println(name);
            }
            session.getTransaction().commit();
        }catch(Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }finally {
            HibernateUtils.closeSession(session);
        }
    }   
}
PageQueryTest.java
package com.bjsxt.hibernate;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Session;
import junit.framework.TestCase;
/**
* 分页查询
* @author Administrator
*
*/
public class PageQueryTest extends TestCase {
    public void testQuery1() {
        Session session = null;
        try {
            session = HibernateUtils.getSession();
            session.beginTransaction();
           
            List students = session.createQuery("from Student")
                                    .setFirstResult(1)
                                    .setMaxResults(2)
                                    .list();
            for (Iterator iter=students.iterator(); iter.hasNext();) {
                Student student = (Student)iter.next();
                System.out.println(student.getName());
            }
            session.getTransaction().commit();
        }catch(Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }finally {
            HibernateUtils.closeSession(session);
        }
    }       
}