Hibernate 原生查询 createSQLQuery 详解

来源:互联网 发布:js中format 日期函数 编辑:程序博客网 时间:2024/04/30 15:25

如何使用Hibernate原生查询?

首先,先让大家看看我的表结构,如图所示

 

其中orgid为机构ID 自动增加,cid为外键 标识学校ID,orgname为机构名字......

学校和机构是一对多的关系....

在HIBERNATE中要查询CID=1学校的下属机构有哪些怎么办呢

可以 C c = session.load(C.class,cid)...

          Set <Org> orgs = c.getOrgs();

若查询中要求按ID排列呢,上述方法肯定不行了,那我们有必要看看Hibernate提供的原生查询了

 

1. 标量查询

 

查询方法1

  1. public void testSQL1()
  2.  {
  3.   Session session = HibernateSessionFactory.getSession();
  4.   Transaction trans = null;
  5.   List<Org> l = null;
  6.   trans = session.beginTransaction();
  7.   Query query = session.createSQLQuery(
  8.     "select * from org");
  9.   List<Object[]> object = query.list();
  10.   for(Object[] o:object)
  11.   {
  12.    int len = o.length;
  13.    for(int i=0;i<len;i++)
  14.    {
  15.     System.out.println(o[i]);
  16.    }
  17.   }
  18.   trans.commit();
  19.   session.close();
  20.   
  21.  }

上述方法

返回一个Object数组(Object[])组成的List,数组每个元素都是org表的一个字段值。Hibernate会使用ResultSetMetadata来判定返回的标量值的实际顺序和类型。

 

该程序将输出

Hibernate: select * from org
1
1
教务处
0983-32432
四川绵阳
2
1
计算机学院
0983-32423
四川绵阳
3
1
物理学院
0932-32432
四川绵阳

此输出按列号输出

 

如果要避免过多的使用ResultSetMetadata,或者只是为了更加明确的指名返回值,可以使用addScalar()

 

列子:

  1. public void testSQL1()
  2.  {
  3.   Session session = HibernateSessionFactory.getSession();
  4.   Transaction trans = null;
  5.   List<Org> l = null;
  6.   trans = session.beginTransaction();
  7.   Query query = session.createSQLQuery(
  8.     "select * from org");
  9.   List<Object[]> object = query.list();
  10.   for(Object[] o:object)
  11.   {
  12.    int len = o.length;
  13.    for(int i=0;i<len;i++)
  14.    {
  15.     System.out.println(o[i]);
  16.    }
  17.   }
  18.   trans.commit();
  19.   session.close();
  20.   
  21.  }

输出

Hibernate: select * from org
1
教务处
2
计算机学院
3
物理学院

 

它仍然会返回Object数组,但是此时不再使用ResultSetMetdata,而是明确的将orgID,orgNAME,,按照Integer,String从resultset中取出。同时,也指明了就算query是使用*来查询的,可能获得超过列出的这两个字段,也仅仅会返回这两个字段。

对全部或者部分的标量值不设置类型信息也是可以的。

sess.createSQLQuery("SELECT * FROM org") .addScalar("ID", Hibernate.Integer) .addScalar("NAME")
2.实体查询(Entity queries)

具体实现

  1. public void testSQL()
  2.  {
  3.   Session session = HibernateSessionFactory.getSession();
  4.   Transaction trans = null;
  5.   List<Org> l = null;
  6.   trans = session.beginTransaction();
  7.   Query query = session.createSQLQuery(
  8.     "select * from org as o where o.cid=?").addEntity(Org.class)
  9.     .setInteger(01);
  10.   l = query.list();
  11.   for(Org o:l)
  12.   {
  13.    System.out.println(o.getOrgname());
  14.   }
  15.   trans.commit();
  16.   session.close();
  17.   
  18.  }

上述程序输出结果为:

Hibernate: select * from org as o where o.cid=?
教务处
计算机学院
物理学院

 


转载请注明出处

Author:Zhang Qi

Email:fish2-2@163.com