原由:在使用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 <>'')