如何使用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
- public void testSQL1()
- {
- Session session = HibernateSessionFactory.getSession();
- Transaction trans = null;
- List<Org> l = null;
- trans = session.beginTransaction();
- Query query = session.createSQLQuery(
- "select * from org");
- List<Object[]> object = query.list();
- for(Object[] o:object)
- {
- int len = o.length;
- for(int i=0;i<len;i++)
- {
- System.out.println(o[i]);
- }
- }
- trans.commit();
- session.close();
- }
上述方法
返回一个Object数组(Object[])组成的List,数组每个元素都是org表的一个字段值。Hibernate会使用ResultSetMetadata来判定返回的标量值的实际顺序和类型。
该程序将输出
Hibernate: select * from org
1
1
教务处
0983-32432
四川绵阳
2
1
计算机学院
0983-32423
四川绵阳
3
1
物理学院
0932-32432
四川绵阳
此输出按列号输出
如果要避免过多的使用ResultSetMetadata
,或者只是为了更加明确的指名返回值,可以使用addScalar()
。
列子:
- public void testSQL1()
- {
- Session session = HibernateSessionFactory.getSession();
- Transaction trans = null;
- List<Org> l = null;
- trans = session.beginTransaction();
- Query query = session.createSQLQuery(
- "select * from org");
- List<Object[]> object = query.list();
- for(Object[] o:object)
- {
- int len = o.length;
- for(int i=0;i<len;i++)
- {
- System.out.println(o[i]);
- }
- }
- trans.commit();
- session.close();
- }
输出
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)
具体实现
- public void testSQL()
- {
- Session session = HibernateSessionFactory.getSession();
- Transaction trans = null;
- List<Org> l = null;
- trans = session.beginTransaction();
- Query query = session.createSQLQuery(
- "select * from org as o where o.cid=?").addEntity(Org.class)
- .setInteger(0, 1);
- l = query.list();
- for(Org o:l)
- {
- System.out.println(o.getOrgname());
- }
- trans.commit();
- session.close();
- }
上述程序输出结果为:
Hibernate: select * from org as o where o.cid=?
教务处
计算机学院
物理学院
转载请注明出处
Author:Zhang Qi
Email:fish2-2@163.com