sharding key 报错

This commit is contained in:
GYJ
2025-01-06 17:23:26 +08:00
parent 18a5eae1ae
commit e61e3bb520

View File

@@ -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("没有找到匹配的表名");
}
}
}