按翻译的枚举排序

时间:2018-01-15 10:14:05

标签: java sql oracle11g

我遇到以下问题:我必须按枚举参数对实体进行排序。问题是,枚举名称不等同于其翻译名称,例如,枚举值可以是:

enum Sample {
  Bus, Car, Train
}

但是,请以我的语言说Bus对应pksCar对应autoTrain对应{{1}他们的订单应该是: ciuchcia而非Car, Train, Bus。这只是一个例子,我的问题涉及10种不同的价值观。

问题是,我无法获取所有数据,然后在Java中执行排序,因为数据是分页的。我试图通过在SQL中执行此操作来解决此问题(数据来自数据库视图):

Bus, Car, Train

我按号码排序,这个解决方案有效。但是,我觉得这可以做得更好,每次我想添加一些内容时都不需要修改。任何帮助都将非常感激。

2 个答案:

答案 0 :(得分:0)

如果您可以对enum中的翻译进行硬编码或填充,则可以enum生成查询。

enum Sample {
    Bus("pks"), Car("auto"), Train("ciuchcia");
    private final String localName;

    Sample(String localName) {
        this.localName = localName;
    }

    private static final List<Sample> inLocalOrder = Arrays.stream(values())
            .sorted((a,b) -> a.localName.compareTo(b.localName))
            .collect(Collectors.toList());

    public static CharSequence inLocalOrder() {
        StringBuilder sb = new StringBuilder("(CASE");
        int i = 1;
        inLocalOrder.stream().forEach(a -> sb.append(" WHEN '"+a.name()+"' THEN "+i));
        sb.append(" ELSE 0 END)");
        return sb;
    }
}

public void test(String[] args) {
    System.out.println(Sample.inLocalOrder());
}

打印:

  

(例如&#39; Car&#39;那么1&#39;训练&#39;那么2&#39;公共汽车&#39;那么3结束0)

如果翻译后来发生,那么微调就足够了。

答案 1 :(得分:0)

首先要做的事情。为什么你使用Enum来排序东西?我不能同意这个功能,但是如果你真的需要它就可以了。

我非常感谢@ OldCurmudgeon的回答,但我会做一些不同的事情。

我没有使用属性值作为列名,而是使用一种方法来请求正确的列名(显然我假设你没有在代码中映射实体,所以你使用的是枚举他们)。这样:

enum Sample {
    Bus, Car, Train;

    public String getColumnName() {
        // GET IT FROM SOME RESOURCE OR REQUEST IT FROM ANOTHER CONTEXT OR JUST RETURN IT THE WAY IT IS
        // YOU CAN USE A RESOURCE FILE TO MAP YOUR COLUMN NAME, SO IF THE ENTITY CHANGES, YOU DON'T NEED
        // TO UPDATE YOUR CODE...
        return "";
    }

    public static String getSortSQL(Map<Sample, Integer> samples) {
        StringBuilder sb = new StringBuilder("(CASE");
        samples.forEach((sample, number) -> addSampleNumberSQL(sb, sample, number));
        return sb.append(" ELSE 0 END)").toString();
    }

    private static StringBuilder addSampleNumberSQL(StringBuilder sb, Sample sample, Integer number) {
        return sb.append(" WHEN '").append(sample.getColumnName()).append("' THEN ").append(number);
    }
}

如您所见,您可以从您想要的任何资源中请求您的列名。但是这种实现仍然很弱,因为如果需要按任何新列排序,则需要添加另一个Enum值。所以我会实现更强大的东西,比如从资源读取每个属性的属性读取器和接收String(表示属性本身)和数字(按数字排序)的方法,所以我会做像这样的东西:

public static String getSortSQL(Map<String, Integer> properties) {
    StringBuilder sb = new StringBuilder("(CASE");
    properties.forEach((prop, number) -> addSampleNumberSQL(sb, prop, number));
    return sb.append(" ELSE 0 END)").toString();
}

private static StringBuilder addSampleNumberSQL(StringBuilder sb, String property, Integer number) {
    return sb.append(" WHEN '").append(property).append("' THEN ").append(number);
}

希望它对你有所帮助......