spring-data-jpa的@Query运行机制

本文探讨了spring-data-jpa中@Query注解的运行机制,特别是nativeQuery属性的影响。当nativeQuery为false时,使用HQL,为true时则执行原生SQL。通过JpaQueryFactory和AbstractStringBasedJpaQuery,分析了NativeJpaQuery与SimpleJpaQuery的区别,以及它们在不同查询类型如SingleEntityExecution、分页查询、修改和删除中的应用。重点在于NativeJpaQuery如何创建原生查询并处理结果。
摘要由CSDN通过智能技术生成

**

spring-data-jpa对与@Query运行机制

**
我们可以使用@Query注解符给Repository中的方法加入自定义sql,使得方法能按照我们自己想要的方式搜索或修改数据。
关于这个@Query的注解符我们可以看到有一个参数nativeQuery默认值为false,当nativeQuery为false时我们需要给value一个Hql(Hibernate Query Language),当nativeQuery为true时我们需要给value一个Sql。
下面来看一下nativeQuery的true和false会在运行中有什么不同

  1. org.springframework.data.jpa.repository.query.JpaQueryFactory
    JpaQueryFactory是一个enum,他负责生成JpaQuery类,他的内部有这样几个方法
@Nullable
AbstractJpaQuery fromQueryAnnotation(JpaQueryMethod method, EntityManager em,
		QueryMethodEvaluationContextProvider evaluationContextProvider) {
   

	LOG.debug("Looking up query for method {}", method.getName());
	return fromMethodWithQueryString(method, em, method.getAnnotatedQuery(), evaluationContextProvider);
}
@Nullable
AbstractJpaQuery fromMethodWithQueryString(JpaQueryMethod method, EntityManager em, @Nullable String queryString,
		QueryMethodEvaluationContextProvider evaluationContextProvider) {
   

	if (queryString == null) {
   
		return null;
	}

	return method.isNativeQuery() ? new NativeJpaQuery(method, em, queryString, evaluationContextProvider, PARSER)
			: new SimpleJpaQuery(method, em, queryString, evaluationContextProvider, PARSER);
}
@Nullable
public StoredProcedureJpaQuery fromProcedureAnnotation(JpaQueryMethod method, EntityManager em) {
   

	if (!method.isProcedureQuery()) {
   
		return null;
	}

	return new StoredProcedureJpaQuery(method, em);
}

这些方法被org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy的resolveQuery调用来生成JapQuery
可以看到,当我们的使用了@Query注解符以后,会使用fromQueryAnnotation方法来生成,JpaQuery,而fromQueryAnnotation又调用了fromMethodWithQueryString方法,在fromMethodWithQueryString方法中更具method.isNativeQuery()来生成JpaQuery,而这个method.isNativeQuery(),正是获取了注解符中nativeQuery的值(默认是false),也就是说当nativeQuery为true的时候这个三元表达式会返回NativeJapQuery否则返回SimpleJpaQuery

  1. NativeJpaQuery 和 SimpleJpaQuery
    这两个JpaQuery 都继承了AbstractStringBasedJpaQuery类不同的是NativeJpaQuery重写了AbstractStringBasedJpaQuery里面的createJpaQuery方法。
@Override
protected Query createJpaQuery(String queryString, ReturnedType returnedType) {
   

	EntityManager em = getEntityManager();
	Class<?> type = getTypeToQueryFor(returnedType);

	return type == null ? em.createNativeQuery(queryString) : em.createNativeQuery(queryString, type);
}

可以看到createJpaQuery方法返回的是EntityManager.createNativeQuery方法,这个方法是hibernate自己实现的。

再看AbstractStringBasedJpaQuery的createJpaQuery方法

protected Query createJpaQuery(String queryString, ReturnedType returnedType) {
   

		EntityManager em = getEntityManager();

		if (this.query.hasConstructorExpression() || this.query.isDefaultProjection()) {
   
			return em.createQuery(queryS
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值