No entity found for query异常之jpa

Stella981
• 阅读 647

jpa是什么?

JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

JPA 是 JCP 组织发布的 Java EE 标准之一,因此任何声称符合 JPA 标准的框架都遵循同样的架构,提供相同的访问API,这保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行

JPA是需要Provider来实现其功能的,Hibernate就是JPA Provider中很强的一个,应该说无人能出其右。从功能上来说,JPA就是Hibernate功能的一个子集。Hibernate 从3.2开始,就开始兼容JPA。Hibernate3.2获得了Sun TCK的JPA(Java Persistence API) 兼容认证。

出现的问题

工作中使用了jpa来持久化数据,调试的时候抛了这样的异常No entity found for query,找不到查询的实体,导致这个问题主要是使用了getSingleResult()这个方法返回一个实体,下面我们看下源码找下原因

下面是getSingleResult实现源码

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

分析解决问题

从源码实现中的if判断我们可以看到,如果你使用了getSingleResult()来返回实体,结果为0或者大于1都会抛出异常。除非你能肯定你查询的实体存在且只有一个,不然一般返回实体还是建议使用getResultList()取结果集,然后做相关处理,如:

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 ;

先判断结果集大小,根据结果集大小再确定是返回null还是取第一条

本文同步分享在 博客“kailing”(other)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
spring和JPA
Entity使用@Entity注解使javabean类成为实体类。一般使用@Id注解在成员变量或者其对应的get方法设置实体类的主键。例子:packagecom.hgf.jpa.domain;importjavax.persistence.Entity;importjavax
Stella981 Stella981
3年前
Spring Data Jpa 返回自定义对象 DTO 映射问题
关键字:JPA复杂查询,JPA返回自定义实体,JPA返回自定义DTO,JPA联表查询,JPA原生SQL查询,JPA踩坑新冠疫情之下,闲来无事研究了一下JPA,发现坑还是不少的,特地记录一下,有兴趣的道友可以看看。在灵活性上JPA比不上MyBatis,比如想联表查询返回一个自定义的实体Dto,结果发现不能直接返回自定义的实体,典型错误如下:
Wesley13 Wesley13
3年前
JPA 注解
jpa注解核心提示:JPA注解的几个要点1.设置Pojo为实体@Entity//标识这个pojo是一个jpa实体2.设置表名@Entity@Ta
Stella981 Stella981
3年前
JPA和Hibernate的关系
JPAJavaPersistenceAPI,是JavaEE5的标准ORM接口,也是ejb3规范的一部分。Hibernate,当今很流行的ORM框架,是JPA的一个实现,但是其功能是JPA的超集。JPA和Hibernate之间的关系,可以简单的理解为JPA是标准接口,Hibernate是实现。那么Hibernate是如何实现与JPA的这种关系
Stella981 Stella981
3年前
JPA、Hibernate、Spring data jpa之间的关系,终于明白了
什么么是JPA?全称JavaPersistenceAPI,可以通过注解或者XML描述【对象关系表】之间的映射关系,并将实体对象持久化到数据库中。为我们提供了:1)ORM映射元数据:JPA支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;如:@Entity、@Table、@C
Stella981 Stella981
3年前
SpringBoot之JPA
前言:用Spring全家桶,大家常用的应该是jpa,上次我看过一次调查统计,歪果人使用持久化框架jpa比较多,目前国内已知互联网公司mybatis会比较多,可能大家都觉得mybatis的查询效率更高。 SpringDataJPA只是SpringData中的一个子模块,JPA是一套标准接口,而Hibernate是JPA的实现,SpringDataJPA底
Easter79 Easter79
3年前
SpringBoot之JPA
前言:用Spring全家桶,大家常用的应该是jpa,上次我看过一次调查统计,歪果人使用持久化框架jpa比较多,目前国内已知互联网公司mybatis会比较多,可能大家都觉得mybatis的查询效率更高。 SpringDataJPA只是SpringData中的一个子模块,JPA是一套标准接口,而Hibernate是JPA的实现,SpringDataJPA底
Wesley13 Wesley13
3年前
2 Hibernate映射 属性 主键 集合 组件 联合主键
Hibernate提供了三种方式将POJO变成PO类使用持久化注解(以JPA标准注解为主,如果有一些特殊要求,则依然需要使用Hibernate本身提供的注解)使用JPA2提供的XML配置描述文件,这种方式可以让Hibernate的PO类与JPA实体类兼容使用Hibernate传统的XML映射文件(hbm文件)。1Hib
Stella981 Stella981
3年前
SpringBoot JPA(实现查询多值)
JPA是javaPersistenceAPI简称,中文名:java持久层API,JPA是JCP组织发布的J2EE标准之一1.创建DataSource连接池对象!(https://oscimg.oschina.net/oscnet/6d3df05719d12d2195fd92d5520fee1a546.jpg)!(https://
Stella981 Stella981
3年前
JPA、Hibernate框架、通用mapper
JPA是描述对象关系表的映射关系,将运行期实体对象持久化到数据库中,提出以面向对象方式操作数据库的思想。Hibernate框架核心思想是ORM实现自动的关系映射。缺点:由于关联操作提出Hql语法。执行CRUD时产生大量冗余的sql,性能较低mybatis继承Hibernate优点,使用通用mapper插件实现JPA的思想操作数据库通用map