使用Query进行HQL语句查询和SQL语句查询
HQL的语法比较简单,与普通SQL的区别之处是针对对象的不同,在查询语句中将sql中的表名替换成了sql中的持久化类名,因为hibernate机制是基于对象进行查询的。
不带参数的查询,语句是“from POJO”的形式,其中POJO即为持久化类名称
Query query=session.createQuery("from User");
带参数的查询
接口Query提供了对命名参数、JDBC风格的(?)两种参数的绑定方法。
命名参数在查询字符串中是形如name的标识符。
命名参数的优点:
1、命名参数与其在查询串中出现的顺序无关。
2、它们可在同一查询串中多次出现。
3、它们本身是自我说明的。
命名参数的使用格式是 :username /* username这里泛指命名参数名 */
赋值采用: Query的setXXX()f方法。
/* 这是使用一个命名参数username,然后给命名参数设置值为“admin”的例子*/
Query query=session.createQuery("from User where username=:username"); query.setString("username","admin");
/* 使用集合类型的命名参数的例子 */
List names=new ArrayList(); names.add("admin"); names.add("test"); Query query=session.createQuery("from User where username in (:nameList)"); query.setParameterList("nameList",names);
hibernate使用问号参数时与JDBC不同,hibernate对参数从0开始计数。JDBC应该是从0开始的
Query query=session.createQuery("from User where username=?");
query.setString(0,"admin");
在HQL语句中可以设置多个问号参数,之后按照"0、1、2、3...”的序号形式来设置各个参数的值。
取读query中的值:
1、将query中的值转换成list然后进行后面的操作
query.list()方法。
demo:
public List<Person> hqlquerylist(String hql){ Session session=HibernateSessionFactory.getSession(); Transaction tx=session.beginTransaction(); List<Person> p = null; try{ Query query=session.createQuery(hql); p=query.list(); tx.commit(); }catch(Exception e){ e.printStackTrace(); tx.rollback(); } return p; }
2、将query中的值转换成iterator对象然后进行后面的操作
1)query.iterator()方法
public Iterator<Person> hqlqueryiterator(String hql){ Session session=HibernateSessionFactory.getSession(); Transaction tx=session.beginTransaction(); Iterator<Person> p = null; try{ Query query=session.createQuery(hql); p=query.iterate(); tx.commit(); }catch(Exception e){ e.printStackTrace(); tx.rollback(); }finally{ session.clear(); } return p; }
2)、将query.list()得到的对象转换称为iterator对象
public Iterator<Person> hqlqueryiterator(String hql){ session=HibernateSessionFactory.getSession(); Transaction tx=session.beginTransaction(); Iterator<Person> p = null; try{ Query query=session.createQuery(hql); //p=query.iterate(); p=query.list().iterator(); tx.commit(); }catch(Exception e){ e.printStackTrace(); tx.rollback(); }/*finally{ session.close(); }*/ return p; }
3、当已知query中的对象为0个或者1个的时候,可以使用uniqueResult()取得一个对象。
返回:单个实例或者null
抛出:当返回的实例大于一个的时候的抛出NonUniqueResultException
public Person queryUniqueResult(int id){ Session session=HibernateSessionFactory.getSession(); Transaction tx=session.beginTransaction(); Person p = null; try{ Query query=session.createQuery("from Person where id=:id"); query.setInteger("id", id); p=(Person) query.uniqueResult(); tx.commit(); }catch(Exception e){ e.printStackTrace(); tx.rollback(); }/*finally{ session.close(); }*/ return p; }
4、标量查询
查询可以在select语句中指定类的属性,甚至可以调用SQL统计函数。统计结果或者属性被称为“标量Scalar”的结果。
demo:
public static void main(String[] args){ PersonDAO persondao=new PersonDAO(); String hql="select P.name,count(P.address) from Person P"; Iterator<Object[]> it=persondao.hqlqueryScalar(hql); while(it.hasNext()){ Object[] o=it.next(); System.out.println(o[0]+"\t"+o[1]); } } public Iterator<Object[]> hqlqueryScalar(String hql){ session=HibernateSessionFactory.getSession(); Transaction tx=session.beginTransaction(); Iterator<Object[]> p = null; try{ Query query=session.createQuery(hql); //p=query.iterate(); p=query.list().iterator(); tx.commit(); }catch(Exception e){ e.printStackTrace(); tx.rollback(); }/*finally{ session.close(); }*/ return p; }
5、分页查询
我们知道,sqlserver的查询使用的是top,mysql使用的是limit,oracle使用的是rownumber。
其实hibernate有快捷的分页查询方式,框架可以自动生成对应的分页查询语句。
使用query对象的setFirstResult()和对象的setMaxResult()设置查询的起始指针和查询的最大数量,再使用query的其他取出对象方法得到想要的值。hibernate自动生成sql查询语句。
注意:指针是从0开始的。也就是指针为0的对应数据库中的第一条记录。
demo:
public Iterator<Student> queryhql(String hql,int first,int max){ session=HibernateSessionFactory.getSession(); Query query=session.createQuery(hql); query.setFirstResult(first); query.setMaxResults(max); Iterator<Student> s=query.list().iterator(); return s; } StudentDAO studentdao=new StudentDAO(); String hql="from Student"; int first=1; int max=2; Iterator<Student> s=studentdao.queryhql(hql, first, max); while(s.hasNext()){ Student stu=s.next(); System.out.println(stu.getName()+"\t"+stu.getAge()+"\t"+stu.getSex()+"\t"+stu.getTelephone()); }
SQL语句查询
使用createSQLQuery()方法,然后在后面加上addEntity()
demo:
public static void main(String[] args){ String sql="select * from student where age=:age and name=:name"; Session session=HibernateSessionFactory.getSession(); SQLQuery sqlquery=session.createSQLQuery(sql).addEntity(Student.class); sqlquery.setString("name", "guozhen"); sqlquery.setInteger("age", 21); List<Student> s=sqlquery.list(); Student stu=s.get(0); System.out.println(stu.getName()+"\t"+stu.getAge()+"\t"+stu.getId()+"\t"+stu.getTelephone()+"\t"+stu.getTelephone()); }