hibernate原生sql注意点

需要什么就查什么

这是写hibernate原生sql的原因

写原生sql(mysql中)需要注意的问题

1.时间字段

update_time datetime DEFAULT NULL

实体类中:

private String serviceTime;

获取的时候,先转Date,再转String

customerAlarm.setTime(DateUtil.getStringDateTime((Date)objArray[0]));

 

时间字段在原生sql拼接时,要加上'';

if (StringUtils.isNotBlank(businessQo.getStartTime())) {
				fromSql += " and p.startTime >= " + "'" + businessQo.getStartTime() + "'";
			}

2.count,sum,max,min,round(avg)

customerAlarm.setCount((BigInteger)objArray[0]);

customerAlarm.setSum((BigDecimal)objArray[0]);

BigInteger maxTime = (BigInteger) (objArray[0] == null ? 0 : objArray[0]);
			businessVo.setMaxTime(maxTime.intValue());
			BigInteger minTime = (BigInteger) (objArray[1] == null ? 0 : objArray[1]);
			businessVo.setMinTime(minTime.intValue());
			BigDecimal averageTime = (BigDecimal) (objArray[2] == null ? 0 : objArray[2]);
			businessVo.setAverageTime(averageTime.intValue());
			BigInteger bigInteger = (BigInteger) (objArray[3] == null ? 0 : objArray[3]);
			businessVo.setBuinessCount(bigInteger.intValue());

3.不同表的同名字段

不同表的同名字段会冲突,起别名也会冲突

采用IFNULL来转换

select IFNULL(r.id,'') rId,IFNULL(r.strName,'') rStrName,IFNULL(e.id,'') eId,IFNULL(e.strName,'') eStrName from region r, emap e where r.id = e.region_id; 
			regionEmap = new RegionEmap();
			Object[] objArray = (Object[]) o;
			regionEmap.setrId(Integer.valueOf((String) objArray[0]));
			regionEmap.setrStrName((String) objArray[1]);
			regionEmap.seteId(Integer.valueOf((String) objArray[2]));
			regionEmap.seteStrName((String) objArray[3]);
			regionEmapList.add(regionEmap);

4.update

        String sql = "update student set name = 王建国 where id = 1"
        SQLQuery sqlQuery = createSQLQuery(sql);
        sqlQuery.executeUpdate();

5.limit

不支持 limit ?, ?  

所以需要limit 1,8 直接拼接sql

6.原生sql拼接时要注意判空

v.id in (" + idStr + ")

如果idStr为空,会报错

当没有数据时,可能导致idStr为空

7.表实体类和数据库一一对应

如果实体类中新加了字段,但是表还没有加上,就会导致一些HQL查询语句出错

所以,表实体类字段要和数据库表字段一一对应

private Integer channelNo;// 通道号	
@Column(name = "channelNo")
	public Integer getChannelNo() {
		return channelNo;
	}

	public Clientinput setChannelNo(Integer channelNo) {
		this.channelNo = channelNo;
		return this;
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值