单次提取,带有排序结果

时间:2011-08-15 10:10:13

标签: java hibernate jsp

我有这样的代码。

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 个答案:

答案 0 :(得分:2)

只需一行代码即可完成此操作:
使用比较器中的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());
    }
});

完成工作。

答案 1 :(得分:0)

如果我理解正确,您希望以与ID阵列相同的方式订购您的图书清单。

最简单的方法不是对书籍清单进行排序,而是将其转换为地图:

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

然后,以与ID数组相同的顺序遍历您的书籍,只需遍历此数组。确保正确处理空值:如果ID已被删除,则可能存在没有相应书籍的ID:

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

请注意,您也可以简单地执行查询,然后按ID重新询问您的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
}

答案 2 :(得分:0)

您可以在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());
    }
}

现在您的列表应该按顺序相同。另一种方法是创建地图,但是根据代码的复杂程度,这可能是也可能不是最好的解决方案。