解決java報(bào)錯(cuò):使用mybatis?plus查詢一個(gè)只返回一條數(shù)據(jù)的sql,卻報(bào)錯(cuò)返回了1000多條問(wèn)題
今天遇到一個(gè)問(wèn)題
系統(tǒng)線上問(wèn)題
- 經(jīng)常出現(xiàn)這樣的問(wèn)題,剛重啟系統(tǒng)時(shí)不報(bào)錯(cuò)了,可是運(yùn)行一段時(shí)間又會(huì)出現(xiàn)。
- sql已經(jīng)寫(xiě)了limit 1,mybatis的debug日志也返回total為1,可是卻報(bào)錯(cuò)返回了1805條數(shù)據(jù)


乍一看,感覺(jué)太不可思議了
其實(shí)還是被默認(rèn)的東西給坑到了,也不能說(shuō)是坑,就是不理解里面的原理,拿來(lái)就用,以為是這個(gè)功能,其實(shí)還有隱藏的內(nèi)幕在里面。
這個(gè)里面的東西就是selectOne方法,這個(gè)方法,我們以為的查詢方式是這樣的:
select code,username,sex,age,birth from t_user where code=#[code] limit 1
但是它里面并沒(méi)有那么智能,就像它的名字selectOne一樣,你想查詢一條記錄,那么我就幫你查一條記錄,如果有多條記錄,那么我報(bào)錯(cuò)也是合情合理的吧,畢竟你只查一條記錄,也沒(méi)有說(shuō)要查哪一條是吧。
實(shí)際上
MyBatis Plus(com.baomidou.mybatisplus.core.mapper.BaseMapper.selectOne)是這樣的:
/**
* 根據(jù) entity 條件,查詢一條記錄,現(xiàn)在會(huì)根據(jù){@code throwEx}參數(shù)判斷是否拋出異常,如果為false就直接返回一條數(shù)據(jù)
* <p>查詢一條記錄,例如 qw.last("limit 1") 限制取一條記錄, 注意:多條數(shù)據(jù)會(huì)報(bào)異常</p>
*
* @param queryWrapper 實(shí)體對(duì)象封裝操作類(可以為 null)
* @param throwEx boolean 參數(shù),為true如果存在多個(gè)結(jié)果直接拋出異常
*/
default T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper, boolean throwEx) {
List<T> list = this.selectList(queryWrapper);
// 抄自 DefaultSqlSession#selectOne
int size = list.size();
if (size == 1) {
return list.get(0);
} else if (size > 1) {
if (throwEx) {
throw new TooManyResultsException("Expected one result (or null) to be returned by selectOne(), but found: " + list.size());
}
return list.get(0);
}
return null;
}而MyBatis(org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne)是這樣的:
@Override
public <T> T selectOne(String statement, Object parameter) {
// Popular vote was to return null on 0 results and throw exception on too many.
List<T> list = this.selectList(statement, parameter);
if (list.size() == 1) {
return list.get(0);
}
if (list.size() > 1) {
throw new TooManyResultsException(
"Expected one result (or null) to be returned by selectOne(), but found: " + list.size());
} else {
return null;
}
}是吧,拿來(lái)的東西固然好,但是也要花點(diǎn)時(shí)間學(xué)習(xí)里面的精髓。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Java實(shí)現(xiàn)大數(shù)據(jù)量查詢處理的詳細(xì)方案介紹
- 在Java中基于Geotools對(duì)PostGIS數(shù)據(jù)庫(kù)的空間查詢實(shí)踐教程
- Java實(shí)現(xiàn)Elasticsearch查詢當(dāng)前索引全部數(shù)據(jù)的完整代碼
- Java根據(jù)前端返回的字段名進(jìn)行查詢數(shù)據(jù)的實(shí)現(xiàn)方法
- Java如何根據(jù)前端返回的字段名進(jìn)行查詢數(shù)據(jù)
- java 根據(jù)前端返回的字段名進(jìn)行查詢數(shù)據(jù)
- Java如何使用遞歸查詢多級(jí)樹(shù)形結(jié)構(gòu)數(shù)據(jù)(多級(jí)菜單)
相關(guān)文章
Netty分布式固定長(zhǎng)度解碼器實(shí)現(xiàn)原理剖析
這篇文章主要為大家介紹了Netty分布式固定長(zhǎng)度解碼器原理剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(13)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-07-07
SWT(JFace)體驗(yàn)之打開(kāi)多個(gè)Form
SWT(JFace)體驗(yàn)之打開(kāi)多個(gè)Form的實(shí)現(xiàn)代碼。2009-06-06
Java關(guān)鍵字final的實(shí)現(xiàn)原理分析
這篇文章主要介紹了Java關(guān)鍵字final的實(shí)現(xiàn)原理分析,在JDK8之前,如果在匿名內(nèi)部類中需要訪問(wèn)局部變量,那么這個(gè)局部變量一定是final修飾的,但final關(guān)鍵字可以省略,需要的朋友可以參考下2024-01-01
MyBatis的通俗理解:SqlSession.getMapper()源碼解讀
這篇文章主要介紹了MyBatis的通俗理解:SqlSession.getMapper()源碼解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
Spring Boot如何使用httpcomponents實(shí)現(xiàn)http請(qǐng)求
這篇文章主要介紹了Spring Boot使用httpcomponents實(shí)現(xiàn)http請(qǐng)求的示例代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07

