起因:在使用SpringDataJPA语句进行对数据库表的某个字段的空值查询时,如:
findByIdAndNameIsNull
findByIdAndNameIsNotNull
当name这个字段值为''空串时,查询出来的结果差别很大mysql
CREATE TABLE `user` ( `id` bigint(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, `age` int(11) DEFAULT NULL, PRIMARY KEY (`id`) )
Mysql8.0.13:sql
UPDATE `user` u SET u.`name` = '' WHERE u.id = 4 SELECT * FROM `user` u WHERE u.id = 4 AND u.`name` IS NOT NULL--有值 SELECT * FROM `user` u WHERE u.id = 4 AND u.`name` IS NULL--无值 UPDATE `user` u SET u.`name` = NULL WHERE u.id = 4 SELECT * FROM `user` u WHERE u.id = 4 AND u.`name` IS NOT NULL--无值 SELECT * FROM `user` u WHERE u.id = 4 AND u.`name` IS NULL--有值
Oracle11g:数据库
UPDATE `user` u SET u.`name` = '' WHERE u.id = 4 SELECT * FROM `user` u WHERE u.id = 4 AND u.`name` IS NOT NULL--无值 SELECT * FROM `user` u WHERE u.id = 4 AND u.`name` IS NULL--有值 UPDATE `user` u SET u.`name` = NULL WHERE u.id = 4 SELECT * FROM `user` u WHERE u.id = 4 AND u.`name` IS NOT NULL--无值 SELECT * FROM `user` u WHERE u.id = 4 AND u.`name` IS NULL--有值
综上:能够看到Oracle数据库认为不管''空串仍是null均为空,而Mysql则严格意义null才是空oracle
JPA查询ide
List<UserDo> findByIdAndNameIsNull; List<UserDo> findByIdAndNameIsNotNull;
插入测试数据测试
INSERT INTO `user`(`id`, `name`, `age`) VALUES (4, NULL, 22); INSERT INTO `user`(`id`, `name`, `age`) VALUES (5, '', 22); INSERT INTO `user`(`id`, `name`, `age`) VALUES (6, '', 22);
运行并查看结果:
List<UserDo> findByIdAndNameIsNull;
id=4
List<UserDo> findByIdAndNameIsNotNull;
id=5和id=6
总结:JPA查询认为null才是严格意义上的空!code
在实际生产中咱们泛意义的认为''和null都为空,这样在使用JPA进行查询时,要避免使用含Null的查询,能够使用HQL进行查询细化blog
// 查询空字段 SELECT u FROM UserDo u WHERE u.id = 4 AND (u.name is null or u.name ='') // 查询非空字段 SELECT u FROM UserDo u WHERE u.id = 4 AND (u.name is not null and u.name <>'')
转载于:https://blog.51cto.com/12012821/2402281ci