2015-07-21 40 views
1

我怎样才能找到一个独特的结果编写自定义Creteria API, 匹配数据库中的最长的序列?标准ILIKE mechanizm

如果我有请求字符串“V1234”应该如果我有请求字符串“V12XXX”匹配V123

V1234 -> V123 

如果我有要求,应匹配V12

串“V”应该匹配到V

回答

1

您可以通过长递减的值进行排序,然后遍历这些值来检查是否匹配,如果匹配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; 
      } 
     } 
    } 
} 
0

你可以做类似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