2012-03-17 1 views
2

Так я новичок в Java и Play все еще путаются время от времени о квази объектно-ориентированном программировании ...Java Play Framework с помощью функции поиска и JPQL создать список объектов с дубликатами из списка строк

мне нужно конвертируйте строку с разделителями с повторяющимися значениями в список объектов, а также с этими повторяющимися значениями в том же порядке, что и строка.

Пример:

У меня есть форма, где пользователь отправляет пространства строки с разделителями. Например:

http://www.feedme.com?food=apple+orange+banana+apple+grape+apple

, который идет в

public static List<Food> getFoodList(String foodString) { 
    foodString = foodString.trim(); 
    List<String> foods = Arrays.asList(foodString.split("\\s+")); 
    List<Food> foodList = Food.find("name IN (:foods)").bind("foods", foods).fetch(); 
    return foodList; 
} 

печатает петлю списка строк на экран и получить ожидаемое: яблока оранжевых банана яблока винограда яблока

Я печатаю значение Food.name для каждого в цикле foodList a го получить: Grape Яблоко Banana Orange

Это явно проблема с IN в ИНЕКЕ, так как это ожидаемое поведение.

Итак, мое текущее решение вручную заполнить список проходом по списку и выполнив следующую команду на каждой строке в Список продуктов

List<Food> foodList = new ArrayList<Food>(foods.size()); 
    for (String name: foods){ 
     Food food = Food.find("byName", name).first(); 
     foodList.add(food); 
    } 

Это работает, как я хочу его, но только кажется, не очень элегантный или эффективный. Нужны дубликаты, поэтому я считаю, что это исключает IN. У кого-нибудь есть лучшие идеи? Если ответ будет отрицательным, это тоже понравилось бы!

Большое спасибо.

ответ

0

Существует нет (по крайней мере, не разумного) способа построения такого запроса JPQL. Если выполнение слишком много запросов в надоедаешь цикл, вы можете получить объекты общественного питания в одном запросе и сопоставить их потом что-то вроде (не скомпилированное/испытанное, но так же, как идею):

List<Food> matchFoodNamesToFoods(List<String> foodNames , List<Food> foodList) { 
    final ArrayList<Food> result = new ArrayList<Food>(); 
    for (String foodName: foodNames) { 
     for (Food food: foodList) { 
      if (food.getName().equals(foodName)) { 
       result.add(food); 
      } 
      //maybe you want to add null here when no match 
     } 
    } 
    return result; 
} 

В зависимости о размере от foodList и ожидается, количество дублей (и, возможно, вы найдете его более ясным, а) вы также можете сначала создать карту с foodName/записи еды и запросить его во внутреннем цикле:

List<Food> matchFoodNamesToFoods(List<String> foodNames , List<Food> foodList) { 
    final ArrayList<Food> result = new ArrayList<Food>(); 
    final Map<String, Food> foodNameToFood = new HashMap<String, Food>(); 
    for (Food food: foodList) { 
     for (String foodName: foodNames) { 
      if (food.getName().equals(foodName)) { 
       foodNameToFood.put(foodName, food); 
      } 
     } 
    } 
    for (String foodName: foodNames) { 
     result.add(foodNameToFood.get(foodName)); 
    } 
    return result; 
} 

Кроме того, вы должны решить, действительно не хватает продуктов питания для какое-то имя порождает нулевую запись в результате или представляет собой такую ​​аномалию, что вы скорее через исключение в таком случае.

Смежные вопросы