需要什么就查什么
这是写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;
}