Hibernate使用原生SQL语句(left join左连接查询)

Hibernate使用原生SQL语句

以下是本人对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 MemberActRecord memberActRecord)
	{
		return (List) getHibernateTemplate().execute(new HibernateCallback()
		{
			public Object doInHibernate(Session session)
			{
				String sql = "select {invo.*},{ty.*} from member_act_record invo left join mh_order ty on invo.order_id=ty.id ";
				//筛选查询条件
				if(memberActRecord!=null&&StringUtils.isNotBlank(memberActRecord.getClueOwnerCode())) {
					sql+=" and invo.clue_owner_code="+memberActRecord.getClueOwnerCode();
				}
				if(memberActRecord!=null&&StringUtils.isNotBlank(memberActRecord.getClueOwnerPhone())) {
					sql+=" and invo.clue_owner_phone="+memberActRecord.getClueOwnerPhone();
				}
				if(memberActRecord!=null&&StringUtils.isNotBlank(memberActRecord.getPhone())) {
					sql+=" and invo.phone="+memberActRecord.getPhone();
				}
				if(memberActRecord!=null&&memberActRecord.getOrderId()>0) {
					sql+=" and invo.order_id="+memberActRecord.getOrderId();
				}
				if(memberActRecord!=null&&StringUtils.isNotBlank(memberActRecord.getStatus())) {
					sql+=" and invo.status="+memberActRecord.getStatus();
				}
				if(memberActRecord!=null&&StringUtils.isNotBlank(memberActRecord.getStartDate())) {
					sql+=" and invo.create_time>='"+memberActRecord.getStartDate()+" 00:00:00'";
				}
				if(memberActRecord!=null&&StringUtils.isNotBlank(memberActRecord.getEndDate())) {
					sql+=" and invo.create_time<='"+memberActRecord.getEndDate()+" 23:59:59'";
				}
				if(memberActRecord!=null&&StringUtils.isNotBlank(memberActRecord.getOrderStatus())) {
					sql+=" and ty.status="+memberActRecord.getOrderStatus();
				}
				
				sql+=" order by invo.create_time desc";
				SQLQuery sQuery = session.createSQLQuery(sql);
				sQuery.addEntity("invo", MemberActRecord.class).addEntity("ty", MhOrder.class);
				//在Hibernate中页数和每页显示的记录数不能为负数
				if(memberActRecord.getPage()>=0 && memberActRecord.getPageSize()>=0)
				{
					sQuery.setFirstResult(memberActRecord.getPage());
					sQuery.setMaxResults(memberActRecord.getPageSize());
				}
				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);

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔道不误砍柴功

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值