温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

不同数据库和SpringDataJPA对字段值null,''空值的判断

发布时间:2020-07-31 17:33:58 来源:网络 阅读:1646 作者:茕茕木偶 栏目:编程语言

原由:在使用SpringDataJPA语句进行对数据库表的某个字段的空值查询时,如:
findByIdAndNameIsNull
findByIdAndNameIsNotNull
当name这个字段值为''空串时,查询出来的结果差异很大

1、建表
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`)
)
2、对比mysql和oracle数据库对null的查询

Mysql8.0.13:

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才是空

3、使用SpringDataJPA查询语句对null的定义

JPA查询

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才是严格意义上的空!

4、实际作业中对空的处理

在实际生产中我们泛意义的认为''和null都为空,这样在使用JPA进行查询时,要避免使用含Null的查询,可以使用HQL进行查询细化

// 查询空字段
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 <>'')
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI