码迷,mamicode.com
首页 > 系统相关 > 详细

hibernate的各种查询

时间:2014-07-02 18:24:33      阅读:326      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   使用   width   

Hibernate Query Language(HQL)
Criteria Query
Native SQL
下面对其分别进行解释
select子句:
有时并不需要取得对象的所有属性,这时可以使用select子句进行属性查询,如select s.name from Student s。
例:

void HQLselectDEMO()
bubuko.com,布布扣    {
bubuko.com,布布扣        TRegister user = new TRegister();
bubuko.com,布布扣        Session session = HibernateUtil.currentSession();
bubuko.com,布布扣        Query query = session.createQuery("select u.userName from TRegister u");
bubuko.com,布布扣        List list = query.list();
bubuko.com,布布扣        for(int i = 0 ; i < list.size(); i++)
bubuko.com,布布扣        {
bubuko.com,布布扣            String name = (String)list.get(i);
bubuko.com,布布扣            System.out.println(name);
bubuko.com,布布扣        }
bubuko.com,布布扣    }

如果要查询两个以上的属性桧以数组的方式返回,如下:

void HQLselectDEMO()
bubuko.com,布布扣    {
bubuko.com,布布扣        TRegister user = new TRegister();
bubuko.com,布布扣        Session session = HibernateUtil.currentSession();
bubuko.com,布布扣        Query query = session.createQuery("select u.userName ,u.sex from TRegister u");
bubuko.com,布布扣        List list = query.list();
bubuko.com,布布扣        for(int i = 0 ; i < list.size(); i++)
bubuko.com,布布扣        {
bubuko.com,布布扣            Object obj[] = (Object[])list.get(i);
bubuko.com,布布扣            
bubuko.com,布布扣            System.out.println(obj[0]+"    的性别是:"+obj[1]);
bubuko.com,布布扣        }
bubuko.com,布布扣    }


在使用属性查询时,由于使用对象数组,操作和理解不太方便,如果将 一个object[]中所有成员封装成一个对象就方便多了。下面的程序做了示例:

void HQLselectDEMO()
bubuko.com,布布扣    {        
bubuko.com,布布扣        Session session = HibernateUtil.currentSession();
bubuko.com,布布扣        Query query = session.createQuery("select new TRegister(u.userName,u.sex) from TRegister u");
bubuko.com,布布扣        List list = query.list();
bubuko.com,布布扣        for(int i = 0 ; i < list.size(); i++)
bubuko.com,布布扣        {
bubuko.com,布布扣            //Object obj[] = (Object[])list.get(i);
bubuko.com,布布扣            TRegister user = (TRegister)list.get(i);
bubuko.com,布布扣            System.out.println(user.getUserName()+"    的性别是:"+user.getSex());
bubuko.com,布布扣        }
bubuko.com,布布扣        /**要正确运行以上程序,需要在TRegister类中加入一个相应的构造函数
bubuko.com,布布扣         public TRegister(String userName,String sex) {
bubuko.com,布布扣                this.userName = userName;
bubuko.com,布布扣                this.sex = sex;
bubuko.com,布布扣            }
bubuko.com,布布扣          */
bubuko.com,布布扣    }


where子句:
HQL也支持子查询,它通过where子句实现这一机制。where子句可以让用户缩小要返回的实例的列表范围。例如下面语句会返回所有名字为"Bill"的Student实例:
Query query = session.createQuery("from Student as s where s.name=‘Bill‘");
where子句允许出现的表达式包括了SQL中可以使用的大多数情况。
数学操作:+,-,*,/
真假比较操作:=, >=, <=, <>, !=, like
逻辑操作:and ,or, not
字符串连接:||
SQL标题函数 :如upper()和lower()
如果查询返回多条记录,可以用以下关键字来量化
all:表示所有的记录。
any:表示所有记录中的任意一条。
some:与any相同。
in:与any等价。
exists:表示子查询至少要返回一条记录。
例如,下面语句返回所有学生年龄都大于18的班级对象
from Group g where 18<all  (select s.age from g.students s)
下列语句返回在所有学生中有一个学生的年龄等于22的班级:
from Group g where 22 = any (select s.age from g.students s)
或者
from Group g where 22= some(select s.age from g.students s)
或者
from Group g where 22 in (select s.age from g.students s)

连接查询
与SQL一样,HQL也支持连接查询,如内连接,外连接和交叉连接:
inner join:内连接
left outer join:左外连接
rigth outer join:右外连接
full join:全连接,但不常用
下面我重点介绍下内连接查询,左外连接和或外连接和内连接大同小异,而全连接几乎没有使用得到的地方。
inner join可以简写为join,例如在查询得到的Group对象时,内连接取得对应的Student对象,实现的程序代码如下:

= null;
bubuko.com,布布扣        Group group = null;
bubuko.com,布布扣        Query query = session.createQuery("from Group g join g.students");
bubuko.com,布布扣        List list = query.list();
bubuko.com,布布扣        Object obj[] = null;
bubuko.com,布布扣        for(int i = 0 ; i < list.size(); i++)
bubuko.com,布布扣        {
bubuko.com,布布扣            obj = (Object[])list.get(i);
bubuko.com,布布扣            group = (Group)obj[0];//group是数组是第一个对象
bubuko.com,布布扣            stu = (Student)obj[1];//stu是数组的第二个对象
bubuko.com,布布扣            System.out.println(stu.getName()+"属于"+group.getName());
bubuko.com,布布扣        }
bubuko.com,布布扣    


Criteria Query方式
 当 查询数据时,往往需要设置查询条件。在SQL或HQL语句中,查询条件常常放在where子句中。此处Hibernate还支持Criteria查询,这 种查询方式把查询条件封装为一个Criteria对象。在实际应用中,可以使用Session的createCriteria()方法构建一个 org.hibernate.Criteria实例,然后把具体的查询条件通过Criteria的add方法加入到Criteria实例中。这样程序员可 以在不使用SQL甚至HQL的情况下进行数据查询。如下:

public void criteriaDEMO()
bubuko.com,布布扣    {
bubuko.com,布布扣        Session session = HibernateUtil.currentSession();
bubuko.com,布布扣        Criteria criteria = session.createCriteria(TRegister.class);//生成一个Criteria实例
bubuko.com,布布扣        criteria.add(Restrictions.eq("userName","fengyan"));//等价于where name = ‘fengyan‘
bubuko.com,布布扣        List list = criteria.list();
bubuko.com,布布扣        TRegister user = (TRegister)list.get(0);
bubuko.com,布布扣        System.out.println(user.getUserName());
bubuko.com,布布扣    }

  List list = criteria.list();
  Student stu = (Student)list.get(0);
或者:
  Criteria criertia = session.createCriteria(Student.class);
  criteria.add(Restrictions.like("name", "t",MatchMode.START));
  List list = criteria.list();
  Student stu = (Student)list.get(0);
查询学生姓名在Bill,Jack和Tom之间所有的Student对象
 String[] names = {"Bill","Jack","Tom"};
  Criteria criertia = session.createCriteria(Student.class);
  criteria.add(Restrictions.in("name", names));
  List list = criteria.list();
  Student stu = (Student)list.get(0);
查询学生年龄(age)等于22或为空(null)的所有学生对象
Criteria criertia = session.createCriteria(Student.class);
  criteria.add(Restrictions.eq("age", new Integer(22)));
  criteria.add(Restrictions.isNull("age"));
  List list = criteria.list();
  Student stu = (Student)list.get(0);
查询学生姓名以字母F开头的所有Student对象,并按姓名升序排序
Criteria criertia = session.createCriteria(Student.class);
  criteria.add(Restrictions.like("name", "F%"));
  criteria.addOrder(Order.asc("name"));
  List list = criteria.list();
  Student stu = (Student)list.get(0);
注意调用Order.asc的方法应该是Criteria.addOrder()方法。

bubuko.com,布布扣Criteria criertia = session.createCriteria(Group.class);
bubuko.com,布布扣        criteria.setFetchMode("students", FetchMode.EAGER);
bubuko.com,布布扣        criteria.add(Restrictions.like("name""2005",MatchMode.END));
bubuko.com,布布扣        List list = criteria.list();

以上两种方式编写的代码都使用相同的SQL语句来完成它们的功能,如下:
select  g.*, s.* from Group g
left outer join Student s
on g.id = s.group_id
where g.name like ‘%2005‘

bubuko.com,布布扣String sql = "select {s.*} from t_student s where s.age>22";
bubuko.com,布布扣//{}用来引用数据表的别名,{s.*}表示使用s来做为t_student表的别名
bubuko.com,布布扣SQLQuery sqlQuery = session.createSQLQuery(sql);
bubuko.com,布布扣sqlQuery.addEntity("s",Student.class);
bubuko.com,布布扣List list = sqlQuery.list();
bubuko.com,布布扣for(int i = 0 ; i < list.size(); i++)
bubuko.com,布布扣{
bubuko.com,布布扣    Student stu = (Student)list.get(i);
bubuko.com,布布扣}
bubuko.com,布布扣//createSQLQuery(String sql)利用传入的sql参数构造一个SQLQuery实例。使用该方法时,还需要传入查询的实体类,因此在配合使用SQLQuery的addEntity()方法一起使用。
bubuko.com,布布扣 bubuko.com,布布扣  </class>
bubuko.com,布布扣    
bubuko.com,布布扣    <sql-query name="QueryStudents">
bubuko.com,布布扣        <![CDATA[
bubuko.com,布布扣                    select {s.*} from t_student s where s.age > 22
bubuko.com,布布扣        ]]>
bubuko.com,布布扣            <return alias="s" class="Student" />
bubuko.com,布布扣    </sql-query>
bubuko.com,布布扣</hibernate-mapping> 配合以上配置我们可以如下编写代码来查询

= session.getNamedQuery("QueryStudents");
bubuko.com,布布扣List list = query.list();
bubuko.com,布布扣for(int i = 0 ; i < list.size();i++)
bubuko.com,布布扣{
bubuko.com,布布扣    Student stu = (Student)list.get(i);
bubuko.com,布布扣
bubuko.com,布布扣}

也可以在命名查询是设定参数,如下:

<sql-query name="QueryStudents">
bubuko.com,布布扣        <![CDATA[
bubuko.com,布布扣                    select {s.*} from t_student s where s.age > :age
bubuko.com,布布扣        ]]>
bubuko.com,布布扣            <return alias="s" class="Student" />
bubuko.com,布布扣    </sql-query>
bubuko.com,布布扣</hibernate-mapping>

程序代码:

= session.getNamedQuery("QueryStudents");
bubuko.com,布布扣query.setInteger("age",22);
bubuko.com,布布扣List list = query.list();
bubuko.com,布布扣for(int i = 0 ; i < list.size();i++)
bubuko.com,布布扣{
bubuko.com,布布扣    Student stu = (Student)list.get(i);
bubuko.com,布布扣
bubuko.com,布布扣}

自定义insert , update和delete语句:
Hibernate 3.x的映射文件中新添加<sql_insert>,<sql_update>,<sql-delete>3个标记。可以使用这3个标记自定义自己的insert ,update,delete语句,如:

class>
bubuko.com,布布扣    <sql-insert>
bubuko.com,布布扣        insert into t_student(name,age,id) values(?,?,?)
bubuko.com,布布扣    </sql-insert>
bubuko.com,布布扣    <sql-update>
bubuko.com,布布扣        update t_student set name=?,age=? where id=?
bubuko.com,布布扣    </sql-update>
bubuko.com,布布扣    <sql-delete>
bubuko.com,布布扣        delete from t_student where id = ?
bubuko.com,布布扣    </sql-delete>
bubuko.com,布布扣</hibernate-mapping>

对于以上自定义的SQL语句,要注意以下几点
1:insert 和update语句中定义的字段必须和映射文件声明的属性相应,一个都不能少。
2:在insert 和update语句中,属性出现的顺序必须和映射文件中的顺序一样。
3:在insert语句中,主键id总是放在最后。
在程序中实现以上自定义的insert语句如下:

= new Student();
bubuko.com,布布扣stu.setName("Bill");
bubuko.com,布布扣stu.setAge(22);
bubuko.com,布布扣session.save(stu);

如果不想在insert或update语句中包括所有属性,则可以在属性定义时 加上insert ="false"或update="false"如下:

property name = "name" type="string" insert = "false" update="false"/>
bubuko.com,布布扣<sql-insert>
bubuko.com,布布扣    insert into t_student(age,id) values(?,?)
bubuko.com,布布扣</sql-inert>

hibernate的各种查询,布布扣,bubuko.com

hibernate的各种查询

标签:style   blog   http   color   使用   width   

原文地址:http://www.cnblogs.com/shangxiaofei/p/3819845.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!