spring-data-jpa-guide
spring-data-jpa-guide copied to clipboard
想请教下,表名不固定的时候应该怎么办
我们现在经常会遇到表的数量不固定,但是表结构是相同的。比如我们有一个表A记录了所有的运行商与表名的对应关系,每有一个新运营商接入我们系统,就增加一张表,并且在表A中插入一条记录 记录了运营商的名称,对应的表名,当这个运营商登录我们的系统,操作的就是它自己的表,这种场景应该怎么办呢,目前我们是在代码里手动拼接sql,感觉好麻烦啊
利用spel表达式 表名通过参数传递进去。返回结果定一个统一的接口
https://docs.spring.io/spring-data/jpa/docs/2.3.3.RELEASE/reference/html/#jpa.query.spel-expressions
https://docs.spring.io/spring-data/jpa/docs/2.3.3.RELEASE/reference/html/#projection.dynamic
貌似这种种做法行不通
public class AutoTableName extends EmptyInterceptor {
private String targetName;// 目标表名
private String tableName;// 操作表名
public AutoTableName() {}
public AutoTableName(String targetName,String tableName) {
this.targetName= targetName;
this.tableName= tableName;
}
@Override
public String onPrepareStatement(String sql) {
sql = sql.replaceAll(targetName, tableName);
return sql;
}
}
public class TNamingStrategy implements NamingStrategy{
@Override
public String classToTableName(String className) {
// TODO Auto-generated method stub
return tableName(StringHelper.unqualify(className).toUpperCase());
}
@Override
public String columnName(String columnName) {
// TODO Auto-generated method stub
return columnName;
}
@Override
public String propertyToColumnName(String propertyName) {
// TODO Auto-generated method stub
return propertyName.toUpperCase();
}
@Override
public String propertyToTableName(String className, String propertyName) {
// TODO Auto-generated method stub
return classToTableName(className) + '_' + propertyToColumnName(propertyName);
}
@Override
public String tableName(String tableName) {
// TODO Auto-generated method stub
return "T_"+tableName;
}
}