jpa异常No entity found for query问题解决

目录
  • jpa是什么?
  • 出现的问题
  • getSingleResult实现源码
  • 分析解决问题

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还是取第一条

以上就是jpa异常No entity found for query问题解决的详细内容,更多关于jpa异常No entity found for query的资料请关注我们其它相关文章!

(0)

相关推荐

  • SpringBoot2 JPA解决懒加载异常的问题

    jpa解决懒加载异常 在我上一遍文章上进行行修改,SpringBoot2 实现JPA分页和排序分页 实体类上改: @Entity @Table(name = "employee") @JsonIgnoreProperties(value={"hibernateLazyInitializer", "department"}) public class Employee { @Id @GeneratedValue(strategy = Generat

  • 使用Spring Data JPA的坑点记录总结

    前言 Spring-data-jpa的基本介绍:JPA诞生的缘由是为了整合第三方ORM框架,建立一种标准的方式,百度百科说是JDK为了实现ORM的天下归一,目前也是在按照这个方向发展,但是还没能完全实现.在ORM框架中,Hibernate是一支很大的部队,使用很广泛,也很方便,能力也很强,同时Hibernate也是和JPA整合的比较良好,我们可以认为JPA是标准,事实上也是,JPA几乎都是接口,实现都是Hibernate在做,宏观上面看,在JPA的统一之下Hibernate很良好的运行. 最近在

  • JPA添加Pageable实现翻页时报错的问题

    目录 JPA添加Pageable实现翻页时报错 添加别名就可以解决 Spring JPA异常的处理 解决方法 JPA添加Pageable实现翻页时报错 @Query("from Subject where name like CONCAT('%',:name,'%') and isDelete = 0 order by createTime desc") Page<Subject> findSubjectByName(@Param("name") Str

  • SpringBoot JPA懒加载失效的解决方案(亲测有效)

    SpringBoot JPA懒加载失效 使用springBoot JPA 对两个实体类进行双向关联,并设置了懒加载,如下: 然后在查询后用到了roles,会报错, 解决办法如下: 1. 在配置文件中加入: spring.jpa.properties.hibernate.enable_lazy_load_no_trans =true 2. 如果你是在SpringBoot的测试类 中使用报错,则在方法上加入@Transactional注解 在百度查询时发现有人说 修改该配置: spring.jpa.

  • jpa异常No entity found for query问题解决

    目录 jpa是什么? 出现的问题 getSingleResult实现源码 分析解决问题 jpa是什么? JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. JPA 是 JCP 组织发布的 Java EE 标准之一,因此任何声称符合 JPA 标准的框架都遵循同样的架构,提供相同的访问API,这保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行 JPA是需要Provid

  • Spring Boot JPA中使用@Entity和@Table的实现

    本文中我们会讲解如何在Spring Boot JPA中实现class和数据表格的映射. 默认实现 Spring Boot JPA底层是用Hibernate实现的,默认情况下,数据库表格的名字是相应的class名字的首字母大写.命名的定义是通过接口ImplicitNamingStrategy来定义的: /** * Determine the implicit name of an entity's primary table. * * @param source The source inform

  • struts json 类型异常返回到js弹框问题解决办法

    struts json 类型异常返回到js弹框问题解决办法 当struts 框架配置了异常时 例如: <package name="sysCnn" namespace="/" extends="json-default"> <global-results> <result name="error">/WEB-INF/pages/error.jsp</result> <res

  • SpringData如何通过@Query注解支持JPA语句和原生SQL语句

    目录 通过@Query注解支持JPA语句和原生SQL语句 @Query注解的用法(Spring Data JPA) 1.一个使用@Query注解的简单例子 2.Like表达式 3.使用Native SQL Query 4.使用@Param注解注入参数 5.SPEL表达式(使用时请参考最后的补充说明) 6.一个较完整的例子 7.解释例6中错误的原因 通过@Query注解支持JPA语句和原生SQL语句 在SpringData中们可是使用继承接口直接按照规则写方法名即可完成查询的方法,不需要写具体的实

  • JPA @Query时,无法使用limit函数的问题及解决

    目录 JPA@Query时无法使用limit函数问题 解决方案 JPA中limit函数的使用 @Query注解不支持limit函数 JPA @Query时无法使用limit函数问题 使用ssh时,我加入了springdata-jpa去查询sql. 在@query中使用limit函数时,报错,后来分析原因才知道,springdata-jpa的@query中写的sql叫JPQL,jpql是不支持limit函数的. 而原生sql是支持limit函数的,那我们如何在query里写原生sql呢? 解决方案

  • spring data jpa使用详解(推荐)

    使用Spring data JPA开发已经有一段时间了,这期间学习了一些东西,也遇到了一些问题,在这里和大家分享一下. 前言: Spring data简介: Spring Data是一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务. Spring Data 包含多个子项目: Commons - 提供共享的基础框架,适合各个子项目使用,支持跨数据库持久化 JPA - 简化创建 JPA 数据访问层和跨存储的持久层

  • 使用JPA自定义SQL查询结果

    目录 JPA自定义SQL查询结果 直接上代码 最后跑一下demo代码 JPA的SQL查询 一 点睛 二 JPA的NamedQuery查询 三 使用@Query查询 JPA自定义SQL查询结果 很多时候都会遇到自定义sql,自定义返回字段,而不是pojo类.这个情况要通过接口定义返回. 直接上代码 @Query(value = "select m.field AS field,COUNT(m.field) AS size from MigrationObject m where m.xmlName

  • spring jpa设置多个主键遇到的小坑及解决

    目录 jpa设置多个主键遇到的坑 解决办法 jpa遇到多主键表如何进行查询 1.使用 List<Map<String, Object>>的方式去接收 2.自定义接收类 3.配置联合主键 jpa设置多个主键遇到的坑 由于项目需要,对多个业务表单独另外建立对应的历史版本记录表,为了原业务表数据能原封不动记录到历史版本表,需要建立组合主键,id+历史版本号作为主键唯一约束(rid+historyVersion). 在实体上需要设置为主键的字段加上注解,@Id,例如: /* * 主键-RI

  • Idea自动生成Entity实现过程详解

    最近在鼓捣spring -boot ,真好用,学习到jpa. 通过生成Entity 文件,能够快速的生成数据库,并且使用JpaRepository 的基本增删查改 方法,好用的一批. 可是随之,问题来了,实际的开发中,不会是去创建Entity 再去生成数据库的,而是现有了数据库再去搭建整个项目,需要去维护的是数据库,而不是去维护java文件. 所以,就需要去生成Entity文件. idea提供了好用的工具. 第一步,先使用idea去连接数据库. 第二步 选择hibernate 选择成功后悔发现项

随机推荐