读书人

hibernate范例简析-hibernate_hql(一

发布时间: 2012-10-06 17:34:01 作者: rapoo

hibernate实例简析-hibernate_hql(一)

1、StatQueryTest

session = HibernateUtils.getSession();
???session.beginTransaction();
???
//???List students =session.createQuery("select count(*) from Student").list();
//???Long count = (Long)students.get(0);
//???System.out.println(count);

???Long count = (Long)session.createQuery("select count(*) from Student").uniqueResult();
???System.out.println(count);
???
???session.getTransaction().commit();

?

?

List students =session.createQuery("select c.name, count(s) from Student s join s.classes c " +
?????"group by c.name order by c.name").list();
???for (Iterator iter=students.iterator(); iter.hasNext();) {
????Object[] obj = (Object[])iter.next();
????System.out.println(obj[0] + ", " + obj[1]);
???}

?

?简单属性查询【重要】
?* 单一属性查询,返回结果集属性列表,元素类型和实体类中相应的属性类型一致
?* 多个属性查询,返回的集合元素是对象数组,数组元素的类型和对应的属性在实体类中的类型一致
?? 数组的长度取决与select中属性的个数
?* 如果认为返回数组不够对象化,可以采用hql动态实例化Student对象
?参见:SimplePropertyQueryTest.java

2、SimplePropertyQueryTest

List students = session.createQuery("select name from Student").list();
???for (Iterator iter=students.iterator(); iter.hasNext();) {
????String name = (String)iter.next();
????System.out.println(name);
???}

?

?

?

List students = session.createQuery("select id, name from Student").list();
???for (Iterator iter=students.iterator(); iter.hasNext();) {
????Object[] obj = (Object[])iter.next();
????System.out.println(obj[0] + "," + obj[1]);
???}

?

?

?

List students = session.createQuery("select new Student(id, name) from Student").list();
???for (Iterator iter=students.iterator(); iter.hasNext();) {
????Student student = (Student)iter.next();
????System.out.println(student.getId() + "," + student.getName());
???}

?

?

List students = session.createQuery("select s.id, s.name from Student s").list();
???for (Iterator iter=students.iterator(); iter.hasNext();) {
????Object[] obj = (Object[])iter.next();
????System.out.println(obj[0] + "," + obj[1]);
???}

?

?

List students = session.createQuery("select s.id, s.name from Student as s").list();
???for (Iterator iter=students.iterator(); iter.hasNext();) {
????Object[] obj = (Object[])iter.next();
????System.out.println(obj[0] + "," + obj[1]);
???}

?

?

实体对象查询【重要】
?* 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、SimpleObjectQueryTest2

?

List students = session.createQuery("from Student").list();
???for (Iterator iter=students.iterator(); iter.hasNext();) {
????Student student = (Student)iter.next();
????System.out.println(student.getName());
???}

?

Iterator iter = session.createQuery("from Student").iterate();
???while(iter.hasNext()) {
????Student student = (Student)iter.next();
????System.out.println(student.getName());
???}

?

?

List students = session.createQuery("from Student").list();
???for (Iterator iter=students.iterator(); iter.hasNext();) {
????Student student = (Student)iter.next();
????System.out.println(student.getName());
???}
???Iterator iter = session.createQuery("from Student").iterate();
???while(iter.hasNext()) {
????Student student = (Student)iter.next();
????System.out.println(student.getName());
???}

?

?

List students = session.createQuery("from Student").list();
???for (Iterator iter=students.iterator(); iter.hasNext();) {
????Student student = (Student)iter.next();
????System.out.println(student.getName());
???}
???students = session.createQuery("from Student").list();
???for (Iterator iter=students.iterator(); iter.hasNext();) {
????Student student = (Student)iter.next();
????System.out.println(student.getName());
???}

?

读书人网 >软件架构设计

热点推荐