我怎樣才能找到一個獨特的結果編寫自定義Creteria API, 匹配數據庫中的最長的序列?標準ILIKE mechanizm
如果我有請求字符串「V1234」應該如果我有請求字符串「V12XXX」匹配V123
V1234 -> V123
如果我有要求,應匹配V12
串「V」應該匹配到V
我怎樣才能找到一個獨特的結果編寫自定義Creteria API, 匹配數據庫中的最長的序列?標準ILIKE mechanizm
如果我有請求字符串「V1234」應該如果我有請求字符串「V12XXX」匹配V123
V1234 -> V123
如果我有要求,應匹配V12
串「V」應該匹配到V
您可以通過長遞減的值進行排序,然後遍歷這些值來檢查是否匹配,如果匹配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;
}
}
}
}
你可以做類似LikeExpression
但與operands reversed自己的標準執行。然後找到你需要排序的最長時間。不幸的是,我不認爲你可以根據你的領域的長度進行排序,而不需要創建自定義的Order
實現。
criteria.add(new InverseLikeExpression(value, "yourProperty", MatchMode.START)
.addOrder(OrderByLength.desc("yourProperty"))
.setMaxResults(1);
隨着HQL這是一個更容易一點:
where :value like yourProperty || '%' order by length(yourProperty) desc