hibernate的HQL查询

来源:互联网 发布:电视机网络机顶盒破解 编辑:程序博客网 时间:2024/05/02 00:31

    hibernate中使用面向对象的查询语句HQL(hibernate query language)语句 :它的基本构成和MySQL的查询语句差不多,但是查询的是对象。查询基本语法结构如下 :


    其实和sql的语法一模一样,FROM是必须的元素,下面举一个查询的例子:

数据源 :


   对应的类 :

package com.cd.model;public class Student {    private int id;    private String name;    private String sex;    //无参数的构造方法    public Student() {}    //带参数的构造方法1    public Student(String name, String sex) {        this.name = name;        this.sex = sex;    }    //带参数的构造方法2    public Student(int id, String name) {        this.id = id;        this.name = name;    }    //get/set方法}

如果是查询所有的数据,那么SELECT 不是必须的,只需要FROM子句就可以了,返回的仍然是Student对象:test类:

package com.cd.test;import com.cd.model.Book;import com.cd.model.Bookstore;import com.cd.model.Student;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;import org.junit.After;import org.junit.Before;import org.junit.Test;import java.util.ArrayList;import java.util.HashSet;import java.util.Iterator;import java.util.List;public class MainTest {    private Session session;    private SessionFactory sessionFactory;    private Transaction transaction;    @Before    public void init()    {        Configuration configuration = new Configuration().configure();        ServiceRegistry registry =                new ServiceRegistryBuilder().applySettings(configuration.getProperties())                        .buildServiceRegistry();        sessionFactory = configuration.buildSessionFactory(registry);        session = sessionFactory.openSession();        transaction = session.beginTransaction();    }    @After    public void end()    {        transaction.commit();        session.close();        sessionFactory.close();    }    @Test    public void test()    {        String hql = "FROM Student"; //查询所有的数据        Query query = session.createQuery(hql);        List result = query.list(); //保存到list中        Iterator<Student> iterator = result.iterator();        while (iterator.hasNext())        {            System.out.println(iterator.next().getName());        }    }}
    这里值得注意的是要区分大小写,因为查询的Student是一个类,这个和sql不一样。

    如果不查询所有的列,那么返回的就不是Student对象了。

只查询一列的情况 :

    @Test    public void test()    {        String hql = "SELECT name FROM Student"; //只查询name        Query query = session.createQuery(hql);        List result = query.list();         Iterator<Object> iterator = result.iterator(); //返回的是Object集合        while (iterator.hasNext())        {            System.out.println((String) iterator.next());        }    }
查询两列的情况:

    @Test    public void test()    {        String hql = "SELECT name,sex FROM Student";         Query query = session.createQuery(hql);        List result = query.list();        Iterator<Object[]> iterator = result.iterator(); //返回的是Object[]集合        while (iterator.hasNext())        {            Object[] attrs = iterator.next();            String name = (String) attrs[0];            System.out.println(name);        }    }
对于这样的不是返回原对象而是返回Object[ ]的情况还有两种解决办法 :

a.如果Student有能用的构造函数(如果没有对应的构造函数,还要勉强要这样做的话会输出的是null):

    @Test    public void test()    {        String hql = "SELECT new Student (id,name) FROM Student";         Query query = session.createQuery(hql);        List result = query.list();        Iterator<Student> iterator = result.iterator();         while (iterator.hasNext())        {            System.out.println(iterator.next().getName());        }    }
b.如果Student没有能用的构造函数,可以使用map集合:

    @Test    public void test()    {        String hql = "SELECT new map (id as id,name as name) FROM Student";         Query query = session.createQuery(hql);        List result = query.list();        Iterator<Map> iterator = result.iterator();         while (iterator.hasNext())        {            System.out.println(iterator.next().get("name"));        }    }
这里有两个点说明: new map 是小写;不写as会返回null.

下面是一个其他子句一起使用的例子,因为和mysql相似就不一一举例了:

    @Test    public void test()    {        String hql = " FROM Student WHERE id > 0 GROUP BY sex HAVING id < 4 ORDER BY id DESC";        Query query = session.createQuery(hql);        List result = query.list();        Iterator<Student> iterator = result.iterator();         while (iterator.hasNext())        {            System.out.println(iterator.next().getName());        }    }











0 0
原创粉丝点击