jpa異常No entity found for query問(wèn)題解決

jpa是什么?
JPA全稱(chēng)Java Persistence API.JPA通過(guò)JDK 5.0注解或XML描述對(duì)象-關(guān)系表的映射關(guān)系,并將運(yùn)行期的實(shí)體對(duì)象持久化到數(shù)據(jù)庫(kù)中。
JPA 是 JCP 組織發(fā)布的 Java EE 標(biāo)準(zhǔn)之一,因此任何聲稱(chēng)符合 JPA 標(biāo)準(zhǔn)的框架都遵循同樣的架構(gòu),提供相同的訪問(wèn)API,這保證了基于JPA開(kāi)發(fā)的企業(yè)應(yīng)用能夠經(jīng)過(guò)少量的修改就能夠在不同的JPA框架下運(yùn)行
JPA是需要Provider來(lái)實(shí)現(xiàn)其功能的,Hibernate就是JPA Provider中很強(qiáng)的一個(gè),應(yīng)該說(shuō)無(wú)人能出其右。從功能上來(lái)說(shuō),JPA就是Hibernate功能的一個(gè)子集。Hibernate 從3.2開(kāi)始,就開(kāi)始兼容JPA。Hibernate3.2獲得了Sun TCK的JPA(Java Persistence API) 兼容認(rèn)證。
出現(xiàn)的問(wèn)題
工作中使用了jpa來(lái)持久化數(shù)據(jù),調(diào)試的時(shí)候拋了這樣的異常No entity found for query,找不到查詢(xún)的實(shí)體,導(dǎo)致這個(gè)問(wèn)題主要是使用了getSingleResult()這個(gè)方法返回一個(gè)實(shí)體,下面我們看下源碼找下原因
getSingleResult實(shí)現(xiàn)源碼
@SuppressWarnings({ "unchecked", "RedundantCast" })
public X getSingleResult() {
try {
final Listresult = query.list();
if ( result.size() == 0 ) {
NoResultException nre = new NoResultException( "No entity found for query" );
getEntityManager().handlePersistenceException( nre );
throw nre;
}
else if ( result.size() > 1 ) {
final SetuniqueResult = new HashSet(result);
if ( uniqueResult.size() > 1 ) {
NonUniqueResultException nure = new NonUniqueResultException( "result returns more than one elements" );
getEntityManager().handlePersistenceException( nure );
throw nure;
}
else {
return uniqueResult.iterator().next();
}
}
else {
return result.get( 0 );
}
}
catch (QueryExecutionRequestException he) {
throw new IllegalStateException(he);
}
catch( TypeMismatchException e ) {
throw new IllegalArgumentException(e);
}
catch (HibernateException he) {
throw getEntityManager().convert( he );
}
}分析解決問(wèn)題
從源碼實(shí)現(xiàn)中的if判斷我們可以看到,如果你使用了getSingleResult()來(lái)返回實(shí)體,結(jié)果為0或者大于1都會(huì)拋出異常。除非你能肯定你查詢(xún)的實(shí)體存在且只有一個(gè),不然一般返回實(shí)體還是建議使用getResultList()取結(jié)果集,然后做相關(guān)處理,如:
Listlist=entityManager().createQuery("SELECT o FROM User o where o.userId=?1", User.class)
.setParameter(1, userId)
.getResultList();
if(list!=null && list.size()!=0){
return list.get(0);
}
return null ;先判斷結(jié)果集大小,根據(jù)結(jié)果集大小再確定是返回null還是取第一條
以上就是jpa異常No entity found for query問(wèn)題解決的詳細(xì)內(nèi)容,更多關(guān)于jpa異常No entity found for query的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Intellij IDEA中一次性折疊所有Java代碼的快捷鍵設(shè)置
這篇文章主要介紹了Intellij IDEA中一次性折疊所有Java代碼的快捷鍵設(shè)置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
利用Java簡(jiǎn)單實(shí)現(xiàn)一個(gè)代碼行數(shù)統(tǒng)計(jì)器方法實(shí)例
這篇文章主要給大家介紹了關(guān)于如何利用Java簡(jiǎn)單實(shí)現(xiàn)一個(gè)代碼行數(shù)統(tǒng)計(jì)器的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
高內(nèi)聚低耦合原則_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
耦合度就是某模塊(類(lèi))與其它模塊(類(lèi))之間的關(guān)聯(lián)、感知和依賴(lài)的程度,是衡量代碼獨(dú)立性的一個(gè)指標(biāo),也是軟件工程設(shè)計(jì)及編碼質(zhì)量評(píng)價(jià)的一個(gè)標(biāo)準(zhǔn)2017-08-08
java實(shí)現(xiàn)ModbusCRC16校驗(yàn)的示例代碼
本文介紹了使用Java實(shí)現(xiàn)ModbusCRC16校驗(yàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11

