您的位置:首页 > 产品设计 > UI/UE

Hibernate 原生查询 createSQLQuery 详解

2008-11-12 14:01 555 查看
如何使用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: