标准ilike mechanizm

时间:2015-07-21 07:50:38

标签: hibernate

如何编写自定义Creteria API以查找唯一结果, 匹配数据库中最长的序列?

如果我有请求字符串“V1234”,它应与V123匹配

V1234 -> V123

如果我有请求字符串“V12XXX”,它应该匹配到V12

如果我有请求字符串“V”,它应与V

匹配

2 个答案:

答案 0 :(得分:1)

您可以按长度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;
            }
        }
    }
}

答案 1 :(得分:0)

您可以将自己的Criterion实施与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