zoukankan      html  css  js  c++  java
  • 使用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;
        }
    View Code

    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;
        }
    View Code

    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;
        }
    View Code

    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;
        }
    View Code


    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]+"	"+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;
        }
    View Code

    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()+"	"+stu.getAge()+"	"+stu.getSex()+"	"+stu.getTelephone());
            }
    View Code

    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()+"	"+stu.getAge()+"	"+stu.getId()+"	"+stu.getTelephone()+"	"+stu.getTelephone());
            
        }
    View Code
  • 相关阅读:
    物理机连接虚拟机中的sqlserver
    Vue.js
    拆分时间段
    System.Threading.Timer
    浏览器被恶心页面占用
    sqlserver超时时间已到
    几年没写CSS
    C#生成高清缩略图
    抽奖概率算法
    html 页面实现指定位置的跳转
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/5443368.html
Copyright © 2011-2022 走看看