如何编写自定义的Creteria API,以便找到唯一的结果,匹配数据库中最长的序列?
如果我有请求字符串"V1234“,它应该与V123匹配
V1234 -> V123如果我有请求字符串"V12XXX“,它应该与V12匹配
如果我有请求字符串"V“,它应该与V匹配
发布于 2015-07-21 16:07:42
您可以按长度desc对值进行排序,然后迭代这些值以检查是否匹配,如果匹配的话为break。
public static void main(String[] args) {
List<String> values = Arrays.asList("V", "V1", "V12", "V123");
Collections.sort(values, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.compareTo(o1);
}
});
String[] test = new String[]{"V123456", "V127896", "V1877", "V2394"};
for (String s : test) {
for (String str : values) {
if (s.contains(str)) {
System.out.println(str);
break;
}
}
}
}发布于 2015-07-21 16:30:40
您可以使用operands reversed使自己的Criterion实现类似于LikeExpression。然后为了找到最长的,你必须排序。不幸的是,我认为如果不创建一个定制的Order实现,就不能按字段的长度排序。
criteria.add(new InverseLikeExpression(value, "yourProperty", MatchMode.START)
.addOrder(OrderByLength.desc("yourProperty"))
.setMaxResults(1);有了HQL,这就简单了一点:
where :value like yourProperty || '%' order by length(yourProperty) deschttps://stackoverflow.com/questions/31533221
复制相似问题