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
四川绵阳
此输出按列号输出
如果要避免过多的使用
列子:
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数组,但是此时不再使用
对全部或者部分的标量值不设置类型信息也是可以的。
具体实现
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
首先,先让大家看看我的表结构,如图所示
其中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
相关文章推荐
- Hibernate原生SQL(createSQLQuery,通过Transformers.ALIAS_TO_ENTITY_MAP设置生成MAP)查询,自动读取ORACLE CLOB内容的解决方案
- 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()
- 使用hibernate的this.getSession().createSQLQuery(sql).list();方法查询数据时出现查到的数据和想象的不一致,很是郁闷,诡异
- Hibernate的createSQLQuery查询的小技巧
- Hibernate的createSQLQuery 查询数据库类型为char的字段时要注意
- Hibernate SQLQuery 原生SQL 查询及返回结果集处理-1
- Hibernate的session.createSQLQuery的几种查询方式
- Hibernate的createSQLQuery查询的问题
- Hibernate SQLQuery 原生SQL 查询及返回结果集处理-1
- 【Hibernate0001】Hibernate的createSQLQuery查询 返回值设置
- Hibernate的createSQLQuery 查询数据库类型为char的字段时要注意
- Hibernate SQLQuery 原生SQL 查询及返回结果集处理-1
- hibernate中的query查询原生sql语句,如何获得返回记录中的每一个字段的值
- Hibernate的createSQLQuery查询的问题
- Hibernate 使用createSQLQuery查询时,缓存问题
- Hibernate的createSQLQuery查询的小例子
- hibernate查询某一个对象后,执行createSQLQuery查询出现的问题
- Hibernate的createSQLQuery 查询数据库类型为char的字段时要注意
- Hibernate SQLQuery 原生SQL 查询及返回结果集处理-1
- hibernate 运行原生sql 语句 createSQLQuery