mysql及hibernate数据查询遇见的几个问题

1、HQL语句查询,String型数字比较大小怪异现象

String型的“9”和“10”默认比较大小时,“9”比“10”大,因为使用第一位比较"9"大于"1".
select max(substring(samCode,13)) from LabSampItems where samCode in('2015-01-218-9','2015-01-218-10');
这里执行的结果是2015-02-218-9大
select max(substring(samCode,13)+0) from LabSampItems where samCode in('2015-01-218-9','2015-01-218-10');
这里执行的结果是2015-01-218-10大,后面的+0处理后再比较大小,是将截取后的9和10转换为数字再进行比较


2、mysql语句查询,截取后分组显示

select distinct(sam_code)  from lab_samp_items where status='30' group by substring(sam_code,1,11)


3、mysql语句查询,查询结果取指定的行数

如取从第10行开始及其之后的20行的记录数据,即取[10,30]之间的20条数据。
select * from y_samp_register limit 10, 20

select * from table limt 5;     //检索前 5 个记录行
//换句话说,limt n 等价于 limt 0,n。 


4、HQL语句查询,涉及到if else判断的

String hql  = "SELECT SUM(charge0*charge8/100+(CASE WHEN (reportAmount-charge9)<=0 THEN 0 ELSE (reportAmount-charge9) END)*charge1),SUM(charge2),SUM(charge1-charge2),count(id) FROM SampCharge WHERE isdel  = '"+Po.N+"' ";


5、msyql语句查询,截取比较

求report_no字段第三个“-”和第四个“-”之间数值的最大值,即:截取第四个“-”之前的所有内容后,再截取倒数第一个“-”之后的所有内容,转换为数字后求最大值
select max(substring_index(substring_index(report_no,'-',4),'-',-1)+0) from lab_sam_report where report_no like '%2015-07-006%';


如有一个report_no为:2015-07-006-02-01

截取第四个“-”之前的所有内容为:2015-07-006-02

截取第四个“-”之前的所有内容后,再截取倒数第一个“-”之后的所有内容为:02

随后转换为数字求取最大值


6、mysql查询语句,大小比较注意

如下查找后没有记录

select * from y_samp_info where start_time >= '2015-12-10 00:00:00' and code='WT14000001' ;

其中数据库记录相应的字段的内容如下:
start_time是2015-12-10,code是WT14000001
其中数据库中start_time是varchar类型,将varchar调整为date或者datetime查询便正确


7、mysql中一个字段中某一字符替换为其他字符

update v_klg_stand_item_judge set dis_text=replace(dis_text,'~','~');


其中v_klg_stand_item_judge是表名,dis_text是字段名称

这里将dis_text字段中的'~'替换为特殊符号的'~'


8、mysql中数据重复,删除重复数据的一种sql语句

select code,count(code) from v_samp_code group by code;
update v_samp_code set is_del='1' where id in(select id from ((select  max(id)as id,code,count(code) as count from v_samp_code group by code having count>1)as tab ));


注意这里必须写as tab


9、mysql中时间戳存放的数据查看具体的时间

如直接查询显示如下截图第一列:

select last_upd_time,id from v_klg_stand_item_judge where id='40288176544b6a870154510c5be2001d';


查看具体时间显示如下截图第一列:

select FROM_UNIXTIME(left(last_upd_time,10)),id from v_klg_stand_item_judge where id='40288176544b6a870154510c5be2001d';


注意:没有left(字段名,10)时,显示的时间不正确,如下图所示



10、数据表字段默认值一般应设置为null,不能设置为空,除非特殊需要

因为:hibernate有时查询时使用like '%var%'----->其中var是个变量名,如果var传入的值为空,即“”,那么like会匹配所有记录,从而导致错误。


11、mysql的sql语句及hql语句中获取第一条记录问题

//hql语句查询出来的有多条语句时,该返回无内容,当有一条语句时,返回成功
jpql.append(" ORDER BY lastUpdTime DESC");
try {
	return (ItemRecord)query(jpql.toString(),true).getSingleResult();
} catch (Exception e) {
	log.info("未查询出实体 ItemRecord");
	return null;
}


//注意hql语句不可使用limist,mysql数据库sql语句可以使用limit
jpql.append(" ORDER BY lastUpdTime DESC LIMIT 0,1 ");
try {
	return (ItemRecord)query(jpql.toString(),true).getSingleResult();
} catch (Exception e) {
	log.info("未查询出实体 ItemRecord");
	return null;
}



//当hql语句查询多条时,可如下语句以获取第一条查询到的记录
jpql.append(" ORDER BY lastUpdTime DESC ");
try {
	Query query =  query(jpql.toString(),true);
	query.setFirstResult(0);
	query.setMaxResults(1);
	return (ItemRecord)query.getSingleResult();
} catch (Exception e) {
	log.info("未查询出实体 ItemRecord");
	return null;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值