Одиночный выбор с отсортированными результатами - PullRequest
1 голос
/ 15 августа 2011

У меня есть такой код.

String[] idList = request.getParameterValues("id");

List list = BookDao.getInstance().getBookList(idList); //select r from Book r where r.id in :idList (using hibernate)

Как я могу получить список

list.get(0).getId() == id[0]

и т. Д.

Ответы [ 3 ]

2 голосов
/ 15 августа 2011

Требуется только одна строка кода , чтобы сделать это:
Сортировать результат, используя idList в Компараторе.

// Get the ids as a List so we can use indexOf()
final List<String> ids = Arrays.asList(idList); 

// After executing this single line, list will be sorted in idList order:
Collections.sort(list, new Comparator<Book>() {
    public int compare(Book o1, Book o2) {
        return ids.indexOf(o1.getId()) - ids.indexOf(o2.getId());
    }
});

Работа выполнена.

0 голосов
/ 15 августа 2011

Вы можете отсортировать выбранные списки либо в getBookList, либо в коде, где вы находитесь в данный момент.

Предполагая, что вы хотите сортировку по 0-n, сначала создайте список строк для массива строк, если они не отсортированы, то есть.

Принимая код:

String[] idList = request.getParameterValues("id");
List<Book> list = BookDao.getInstance().getBookList(idList);

Вы можете сделать это:

List<String> sortedIds = new ArrayList<String>();
for (String s : idList) {
    sortedIds.add(s);
}
Collections.sort(sortedIds);

Теперь вы сортируете свой список книг:

Collections.sort(books, new Comparator<Book>() {
    public int compare(Book book1, Book book2) {
        return book1.getId().compareTo(book2.getId());
    }
}

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

0 голосов
/ 15 августа 2011

Если я правильно понимаю, вы бы хотели, чтобы список ваших книг был упорядочен так же, как ваш массив идентификаторов.

Самый простой способ - не сортировать список книг, а преобразовать его в карту:

Map<String, Book> booksById = new HashMap<String, Book>(list.size());
for (Object o : list) {
    Book book = (Book) o;
    booksById.put(book.getId(), book);
}

А затем, чтобы перебирать книги в том же порядке, что и в массиве идентификаторов, просто перебирайте этот массив. Убедитесь, что правильно обрабатывает пустые значения: может быть идентификатор, для которого нет соответствующей книги, если он был удален:

for (String id : idList) {
    Book book = booksById.get(id);
    // make sure book is not null
}

Обратите внимание, что вы также можете просто выполнить свой запрос, а затем повторно запросить DAO для каждой книги по идентификатору, поскольку в любом случае она должна быть в кэше сеанса:

BookDao.getInstance().getBookList(idList); // queries for books and populate the session cache
for (String id : idList) {
    Book book = BookDao.getInstance().getBookById(id); // no additional query since the book is in cache
    // make sure book is not null
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...