您的位置:首页 > 数据库

Hibernate使用原生SQL语句

2013-01-23 17:27 417 查看




















以下是本人对Hibernate使用原生SQL语句的理解:

在项目开发当中使用Hibernate提供的HQL有时候不能满足需求,尤其是多表查询或者是多表中没创建主外键关联关系,我也试过平常的连接

比如说a表和b表,a、b表没建立主外键关系。a、b表对应的实体为A、B (SQLServer语法)

create table a

(

aId int identity(1,1) not null,

aName varchar(10) not null

)

create table b

(

bId int identity(1,1) not null,

bName varchar(50) not null,

aId int not null

)

select a表字段,b表字段 from A as a,B as b where a.某字段=b.某字段

得出的数据完全不是我想要的数据,使用Left join又报错,在网上找了很多 有人说a、b表没建立主外键所以在Hibernate中不能用left join

,Hibernate没有on关键字。

最后没办法,就想到了用Hibernate的原生SQL语句。

单表Hibernate原生SQL语句

select {a.*} from a as a;

解释:{a.*}表示返回a表中所有的列 并且返回Object[]数组,数组里包含1个对象

多表Hibernate原生SQL语句

select {a.*},{b.*} from a as a left join b as b on a.aId=b.aId;

解释:{a.*},{b.*}返回a表和b表中所有的字段,它返回Object[]数组,数组里包含2个对象 依此类推。

返回多列的Hibernate原生SQL语句

select a.aName,b.bName from a as a left join b as b on a.aId=b.aId;

在网上很多人认为Hibernate原生SQL语句不能返回多列 我就在想开发Hibernate不可能想不到吧!! 假如多张表的字段加起来有100多个字段

,但是只要取的只有10多个字段,那这么办呢?

所以我就研究,最后如我所愿,可以返回多字段,一下就是我写的返回多表和多字段的方法:

//返回2张表中所有的数据

public List getInvoDetailForTaxpayerInfo(final com.ketuoda.entity.Query query,final Page page)

{

return (List) getHibernateTemplate().execute(new HibernateCallback()

{

public Object doInHibernate(Session session)

{

String sql = "select {invo.*},{ty.*} from InvoDetail invo " +

"left join TaxpayerInfo ty on invo.InvoDetail_TaxEnrollID=" +

"left(ty.TaxPayerCertID+'00000000000000000000',20) order by invo.InvoDetail_Date desc";

SQLQuery sQuery = session.createSQLQuery(sql);

sQuery.addEntity("invo", InvoDetail.class).addEntity("ty", TaxpayerInfo.class);

//在Hibernate中页数和每页显示的记录数不能为负数

if(page.getBeginIndex()>=0 && page.getEveryPage()>=0)

{

sQuery.setFirstResult(page.getBeginIndex());

sQuery.setMaxResults(page.getEveryPage());

}

List list = sQuery.list();

if(list!=null && list.size()>0)

{

return list;

}

return null;

}

});

}

//返回多字段

public List getInvoDetailAndInvoDetailTotalMoney(final com.ketuoda.entity.Query query)

{

return (List) getHibernateTemplate().execute(new HibernateCallback()

{

public Object doInHibernate(Session session)

{

String sql = "select distinct(invo.InvoDetail_TaxEnrollID),ty.TaxpayerName,count(*) as cu,"+

"sum(invo.InvoDetail_TotalMoney) as tMoney from InvoDetail invo left join"+

" TaxpayerInfo ty on invo.InvoDetail_TaxEnrollID="+

"left(ty.TaxPayerCertID+'00000000000000000000',20) group by

invo.InvoDetail_TaxEnrollID,ty.TaxpayerName";

SQLQuery sQuery = session.createSQLQuery(sql);

sQuery.addScalar("InvoDetail_TaxEnrollID", Hibernate.STRING);

sQuery.addScalar("TaxpayerName", Hibernate.STRING);

sQuery.addScalar("cu", Hibernate.INTEGER);

sQuery.addScalar("tMoney", Hibernate.INTEGER);

List list = sQuery.list();

if(list!=null && list.size()>0)

{

return list;

}

return null;

}

});

}

返回2张表中所有的数据方法解释:

//session创建的是createSQLQuery而不是createQuery

SQLQuery sQuery = session.createSQLQuery(sql);

//addEntity("表的别名",Class)表示持久化的类 我这里是2个类 因为我返回的是2张表的数据

sQuery.addEntity("invo", InvoDetail.class).addEntity("ty", TaxpayerInfo.class);

返回多字段的数据方法解释:

SQLQuery sQuery = session.createSQLQuery(sql);

//addScalar("列名或者列的别名",Type) Hibernate.STRING表示这列返回的是string类型的,你想返回什么类型就什么类型目的在与你

sQuery.addScalar("InvoDetail_TaxEnrollID", Hibernate.STRING);

sQuery.addScalar("TaxpayerName", Hibernate.STRING);

sQuery.addScalar("cu", Hibernate.INTEGER);

sQuery.addScalar("tMoney", Hibernate.INTEGER);

转载:<a>http://blog.sina.com.cn/s/blog_a5f093b40101csc9.html</a>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: