2016-10-18 4 views
0

私は、どの「受信者」を選択するか決定するためのロジックとして機能するいくつかのパラメータを保存したテーブルを持っています。私は、次のSQL使用正しい受信を選択するデータをフェッチする際のJavaとSQLの比較

table content

:私は以下、このテーブルのコンテンツ/データを図示しているSQLの上方ため

SELECT * 
FROM tableOfReceivers 
WHERE client = 'DU' 
     AND (country = countryOfDestination OR '*' = countryOfDestination) 
     AND (
     (packages >= minNumberOfPackages OR minNumberOfPackages IS NULL) AND 
     (packages <= maxNumberOfPackages OR maxNumberOfPackages IS NULL) 
    ) 
     AND (
     (weight >= minNetWeight OR minNetWeight IS NULL) AND 
     (weight <= maxNetWeight OR maxNetWeight IS NULL) 
    ) 
ORDER BY priority; 

変数がある:

country = BE 
packages = 5 
weight = 50 

SQLは正常に動作し、私は必要な結果を得ます。しかし、私はこれをJavaに変換する必要があります。そうする際には、複雑すぎると感じています。これを行うのが簡単になると思っています。

ArrayList<tableOfReceivers > listOfReceivers = getPersistenceManager().getQueryManager().queryAll(
      tableOfReceivers.class, "this.client = ?1", "this.client", new Object[] { client }, 0); 

ArrayList<tableOfReceivers> result = new ArrayList<tableOfReceivers>(); 

for (tableOfReceivers rec : listOfReceivers) { 
    if ((StringUtils.equals(countryOfDestination, rec.getCountryOfDestination()) 
      || StringUtils.equals("*", rec.getCountryOfDestination()))) { 

     if (((numberOfPackages >= nvl(rec.getMinNumberOfPackages(), 0)) 
       || rec.getMinNumberOfPackages() == null) 
       && (numberOfPackages <= nvl(rec.getMaxNumberOfPackages(),0)) 
       || rec.getMaxNumberOfPackages() == null) { 

      if (((totalNetWeight >= nvl(rec.getMinNetWeight(),0)) || rec.getMinNetWeight() == null) 
        && (totalNetWeight <= nvl(rec.getMaxNetWeight(),0)) || rec.getMaxNetWeight() == null) { 
       result.add(rec); 
      } 
     } 
    } 
} 

Collections.sort(result, new Comparator<tableOfReceivers >() { 

    @Override 
    public int compare(tableOfReceivers o1, tableOfReceivers o2) { 
     return o1.getPriority().compareTo(o2.getPriority()); 
    } 
}); 

System.out.println("Receiver selection result is:" + "\n"); 
if(!result.isEmpty()){ 
    System.out.println(result.get(0).getReceiver() + "\n"); 
}  

}

public static Integer nvl(Integer value, Integer alternateValue) { 
    if (value == null) 
     return alternateValue; 
    return value; 
} 

だから、私はここだけのJavaを使用して必要なものをフェッチするより簡単に、より良い方法があります:

ここで私は、現在使用しているJavaコードはありますか?

ありがとうございます!

+0

のようなヘルパーメソッドを使用することができますなぜあなたはJavaだけを使用しますか? SQLは索引などの情報を使用してデータベースをより効果的に照会できます。 –

+0

Java 8でストリームを使用しないのはなぜですか?これははるかに簡単です。 –

答えて

1

私は

List<tableOfReceivers> result = 
    listOfReceivers.stream() 
        .filter(rec -> countryOfDestination.equals(rec.getCountryOfDestination()) 
            || "*".equals(rec.getCountryOfDestination()) 
        .filter(numberOfPackages >= nvl(rec.getMinNumberOfPackages(), numberOfPackages)) 
        .filter(numberOfPackages <= nvl(rec.getMaxNumberOfPackages(), numberOfPackages)) 
        .filter(totalNetWeight >= nvl(rec.getMinNetWeight(), totalNetWeight)) 
        .filter(totalNetWeight <= nvl(rec.getMaxNetWeight(), totalNetWeight)) 
        .sort(Comparator.comparing(rec -> rec.getPriority())) 
        .collect(Collectors.toList()); 

のJava 8を使用することになりそれとも、in

public static boolean in(int value, Integer min, Integer max) { 
    return (min == null || min <= value) && 
      (max == null || max >= value); 
} 

public static boolean countryMatch(String a, String b) { 
    return "*".equals(a) || "*".equals(b) || a.equals(b); 
} 

List<tableOfReceivers> result = 
    listOfReceivers.stream() 
        .filter(rec -> countryMatch(countryOfDestination, rec.getCountryOfDestination())) 
        .filter(rec -> in(numberOfPackages, rec.getMinNumberOfPackages(), rec.getMaxNumberOfPackages()))) 
        .filter(rec -> in(totalNetWeight, rec.getMinNetWeight(), rec.getMaxNetWeight(), totalNetWeight)) 
        .sort(Comparator.comparing(rec -> rec.getPriority())) 
        .collect(Collectors.toList()); 
+0

これはストリームのパワーです!しかし、その周辺人はどうですか? – AxelH

+0

これは素晴らしいことですし、助けてくれてありがとう!私はそれらの流れに追いつく必要があります。 –

+0

@AxelH一般的にperfは、ウォーミングアップコードのループと同じです。並べ替えは少し遅くても問題はありません。 –

関連する問題