溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

不同數(shù)據(jù)庫和SpringDataJPA對字段值null,''空值的判斷

發(fā)布時(shí)間:2020-07-31 17:33:58 來源:網(wǎng)絡(luò) 閱讀:1685 作者:煢煢木偶 欄目:編程語言

原由:在使用SpringDataJPA語句進(jìn)行對數(shù)據(jù)庫表的某個(gè)字段的空值查詢時(shí),如:
findByIdAndNameIsNull
findByIdAndNameIsNotNull
當(dāng)name這個(gè)字段值為''空串時(shí),查詢出來的結(jié)果差異很大

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數(shù)據(jù)庫對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數(shù)據(jù)庫認(rèn)為無論''空串還是null均為空,而Mysql則嚴(yán)格意義null才是空

3、使用SpringDataJPA查詢語句對null的定義

JPA查詢

List<UserDo> findByIdAndNameIsNull;
List<UserDo> findByIdAndNameIsNotNull;

插入測試數(shù)據(jù)

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);

運(yùn)行并查看結(jié)果:
List<UserDo> findByIdAndNameIsNull;
id=4
List<UserDo> findByIdAndNameIsNotNull;
id=5和id=6
總結(jié):JPA查詢認(rèn)為null才是嚴(yán)格意義上的空!

4、實(shí)際作業(yè)中對空的處理

在實(shí)際生產(chǎn)中我們泛意義的認(rèn)為''和null都為空,這樣在使用JPA進(jìn)行查詢時(shí),要避免使用含Null的查詢,可以使用HQL進(jìn)行查詢細(xì)化

// 查詢空字段
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問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI