jpa @query 动态表名

数据库分表

这里是用修改spring源码方式

#{#entityName} 默认为 实体类@Entity注解的value值,会修改了其中实现

@Query(nativeQuery=true,value="delete from #{#entityName} where mobile=:#{#mobile}") int deleteByMobile(@Param("entityName")String entityName,@Param("mobile")String mobile);

主要修改类:(粗略,未验证)

org.springframework.data.jpa.repository.query.ExpressionBasedStringQuery
private static String renderQueryIfExpressionOrReturnQuery(String query, JpaQueryMethod method,
			SpelExpressionParser parser) {

		Assert.notNull(query, "query must not be null!");
		Assert.notNull(metadata, "metadata must not be null!");
		Assert.notNull(parser, "parser must not be null!");

		if (!containsExpression(query)) {
			return query;
		}
		//
        String entityName=method.getParameters()-->entityName

		StandardEvaluationContext evalContext = new StandardEvaluationContext();
		if(entityName==null){
            evalContext.setVariable(ENTITY_NAME, method.getEntityInformation().getEntityName());
        }else{
            evalContext.setVariable(ENTITY_NAME, entityName);
        }


		query = potentiallyQuoteExpressionsParameter(query);

		Expression expr = parser.parseExpression(query, ParserContext.TEMPLATE_EXPRESSION);

		String result = expr.getValue(evalContext, String.class);

		if (result == null) {
			return query;
		}

		return potentiallyUnquoteParameterExpressions(result);
	}
org.springframework.data.jpa.repository.query.AbstractStringBasedJpaQuery
public AbstractStringBasedJpaQuery(JpaQueryMethod method, EntityManager em, String queryString,
			QueryMethodEvaluationContextProvider evaluationContextProvider, SpelExpressionParser parser) {

		super(method, em);

		Assert.hasText(queryString, "Query string must not be null or empty!");
		Assert.notNull(evaluationContextProvider, "ExpressionEvaluationContextProvider must not be null!");
		Assert.notNull(parser, "Parser must not be null!");

		this.evaluationContextProvider = evaluationContextProvider;
		this.query = new ExpressionBasedStringQuery(queryString, method, parser);

		DeclaredQuery countQuery = query.deriveCountQuery(method.getCountQuery(), method.getCountQueryProjection());
		this.countQuery = ExpressionBasedStringQuery.from(countQuery, method, parser);

		this.parser = parser;

		Assert.isTrue(method.isNativeQuery() || !query.usesJdbcStyleParameters(),
				"JDBC style parameters (?) are not supported for JPA queries.");
	}

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值