sharding key 报错
This commit is contained in:
@@ -4,16 +4,48 @@ import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
|
||||
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;
|
||||
import java.util.Collection;
|
||||
|
||||
public class StandardShardingStrategyConf implements PreciseShardingAlgorithm<Long> {
|
||||
// 自定义包装类实现Comparable接口
|
||||
class ShardingValueWrapper implements Comparable<ShardingValueWrapper> {
|
||||
private Object value;
|
||||
|
||||
public ShardingValueWrapper(Object value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public Object getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {
|
||||
// 根据ID对5取模来确定表名
|
||||
long tableIndex = shardingValue.getValue() % 5;
|
||||
public int compareTo(ShardingValueWrapper other) {
|
||||
// 这里简单比较两个包装类内部持有的对象的toString结果,实际可能需要更合理的比较逻辑
|
||||
return this.value.toString().compareTo(other.value.toString());
|
||||
}
|
||||
}
|
||||
|
||||
public class StandardShardingStrategyConf implements PreciseShardingAlgorithm<ShardingValueWrapper> {
|
||||
|
||||
@Override
|
||||
public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<ShardingValueWrapper> shardingValue) {
|
||||
ShardingValueWrapper wrapper = shardingValue.getValue();
|
||||
Object valueObj = wrapper.getValue();
|
||||
Long valueLong;
|
||||
try {
|
||||
if (valueObj instanceof Long) {
|
||||
valueLong = (Long) valueObj;
|
||||
} else {
|
||||
valueLong = Long.parseLong(valueObj.toString());
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
throw new IllegalArgumentException("无法将传入的分片值转换为Long类型", e);
|
||||
}
|
||||
|
||||
long tableIndex = valueLong % 5;
|
||||
for (String tableName : availableTargetNames) {
|
||||
if (tableName.endsWith(String.valueOf(tableIndex))) {
|
||||
return tableName;
|
||||
}
|
||||
}
|
||||
throw new IllegalArgumentException();
|
||||
throw new IllegalArgumentException("没有找到匹配的表名");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user