我遇到以下问题:我必须按枚举参数对实体进行排序。问题是,枚举名称不等同于其翻译名称,例如,枚举值可以是:
enum Sample {
Bus, Car, Train
}
但是,请以我的语言说Bus
对应pks
,Car
对应auto
,Train
对应{{1}他们的订单应该是:
ciuchcia
而非Car, Train, Bus
。这只是一个例子,我的问题涉及10种不同的价值观。
问题是,我无法获取所有数据,然后在Java中执行排序,因为数据是分页的。我试图通过在SQL中执行此操作来解决此问题(数据来自数据库视图):
Bus, Car, Train
我按号码排序,这个解决方案有效。但是,我觉得这可以做得更好,每次我想添加一些内容时都不需要修改。任何帮助都将非常感激。
答案 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);
}
希望它对你有所帮助......