数据库分表
这里是用修改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.");
}