首先编写sql函数 GET_FIRST_PINYIN_CHAR 获取第一个字符的拼音首字母
BEGIN
DECLARE V_RETURN VARCHAR(255);
DECLARE V_FIRST_CHAR VARCHAR(2);
SET V_FIRST_CHAR = UPPER(LEFT(PARAM,1));
SET V_RETURN = V_FIRST_CHAR;
IF LENGTH( V_FIRST_CHAR) <> CHARACTER_LENGTH( V_FIRST_CHAR ) THEN
SET V_RETURN = ELT(INTERVAL(CONV(HEX(LEFT(CONVERT(PARAM USING gbk),1)),16,10),
0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,
0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB,
0xC8F6,0xCBFA,0xCDDA,0xCEF4,0xD1B9,0xD4D1),
'A','B','C','D','E','F','G','H','J','K','L','M','N','O','P','Q','R','S','T','W','X','Y','Z');
END IF;
RETURN V_RETURN;
END
参数 : PARAM VARCHAR(255)
返回值类型 : varchar(2)
使用的MySQL函数备注:
left(str,length):从左边开始截取字符串
upper(str):将字符串转为大写
length(str):计算字符串长度,一个汉字算三个字符,一个数字或字母算一个字符
character_length(str):汉字、数字、字母都算一个字符
convert(expr USING encode):不同字符集之间的数据转换
hex(Number or Str):将数字或字符串转换为十六进制
conv(Number, from, to):将数字从原来的进制转换成指定的进制
扫描二维码关注公众号,回复:
2845221 查看本文章
interval(N,N1,N2,N3,......):将N的值与后面的值列表进行比较。假如N < N1,则返回值为0;假如N < N2 等等,则返回值为1;假如N < N3 等等,则返回值为2;.....以此类推;假如N 为NULL,则返回值为 -1 。所有的参数均按照整数处理。为了这个函数的正确运行,必须满足 N1 < N2 < N3 < ……< Nn
elt(N,str1,str2,str3,...):若N = 1,则返回值为 str1,若N = 2,则返回值为 str2,以此类推。若N 小于1或大于参数的数目,则返回值为 NULL。
在maven中添加拼音工具jar
pom.xml
<!-- pinyin4j -->
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.0</version>
</dependency>
java获取拼音首字母工具 PinyinUtils.java
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
import org.apache.commons.lang3.StringUtils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PinyinUtils {
/**
* 汉字转换为汉语拼音首字母,英文字符转化为首字母大写
* @param a
* @return
*/
public static String getFirst(String a){
String pinyinName = "";
if (StringUtils.isNotBlank(a)){
if (isChinese(a)){
//是汉字
char[] nameChar = a.toCharArray();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
for (int i = 0; i < nameChar.length; i++) {
try {
pinyinName += PinyinHelper.toHanyuPinyinStringArray(
nameChar[i], defaultFormat)[0].charAt(0);
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
return null;
}
}
return pinyinName;
}else if (isEnglish(a)){
//不是汉字
if (a.length()>=1){
pinyinName = a.substring(0,1).toUpperCase();
return pinyinName;
}
}else {
return "1";
}
}
return null;
}
private static boolean isChinese(String str) {
String regEx = "[\u4e00-\u9fa5]";
Pattern pat = Pattern.compile(regEx);
Matcher matcher = pat.matcher(str);
boolean flg = false;
if (matcher.find())
flg = true;
return flg;
}
private static boolean isEnglish(String str) {
String regEx = "[A-Za-z]";
Pattern pat = Pattern.compile(regEx);
Matcher matcher = pat.matcher(str);
boolean flg = false;
if (matcher.find())
flg = true;
return flg;
}
}
controller
@Resource
private IDemoService iDemoService;
@PostMapping("/getList")
public String getlist(String code){
final String letter = PinyinUtils.getFirst(code);
List<?> list = iDemoService.selectList(letter);
if (list.size() <= 0) {
return JsonUtil.sucessJson("没有要查询的数据");
}
return JsonUtil.sucessJson(list);
}
service省略
mapper.xml
<select id="selectListByCustom" resultType="***.****.entity.****">
SELECT
*
FROM
表名
WHERE
deleted = 0
AND
get_first_pinyin_char(需要筛选的字段) = #{letter}
</select>
这样就完成了