1

我在下面有一些代码用于查询数据库并将数据添加到列表中,

Query q= session.createQuery("select tally_receipt_prefix, tally_receipt_no,           tally_head, tally_amount from Tally_table where tally_system_date='"+fmtd_date+"' and tally_dbcr_indicator='DB' and tally_mode='Ca' order by  tally_head,tally_receipt_prefix,tally_receipt_no");

    payincash = new ArrayList();

    for(Iterator it=q.iterate(); it.hasNext(); )
    {
        Object[] row= (Object[]) it.next();
        payincash.add((String)row[0]);
        payincash.add((String)row[1]);
        payincash.add((String)row[2]);
        payincash.add((String)row[3]);

    }

    System.out.println("cash list in dao: "+payincash);

返回的列表类似于 [prefix1, no1, head1, amt1, prefix2, no2, head2, amt2,]。我正在尝试在 jsp 中制作收据

头1

前缀 1/no1 amt1

prefix2/no2 amt 2


头3

前缀 3/no3 amt3

所以看起来我想在收据 - jsp 文件中按头列对所有记录进行分组。我该怎么做?任何帮助完全赞赏。请原谅我的英语。

编辑:这是我尝试过的,

查询 q= session.createQuery("selecttally_receipt_prefix,tally_receipt_no,tally_head,tally_amount from Tally_table where tally_system_date='"+fmtd_date+"' and tally_dbcr_indicator='DB' and tally_mode='Ca' order by tally_head,tally_receipt_prefix,tally_receipt_no"); System.out.println("查询"+q);

    List heads=new ArrayList();

    for(Iterator it=q.iterate(); it.hasNext(); )
    {
        Object[] row= (Object[]) it.next();

        payincash1=new LinkedHashMap<String, List>();

        heads.add((String)row[2]);

        List tails = null;
        tails=new ArrayList();
        tails.add((String)row[0]);
        tails.add((String)row[1]);
        tails.add((String)row[3]);

        System.out.println("heads in dao from iter 1: "+heads);  
        System.out.println("tails in dao from iter1 on: "+tails);

        if(heads.contains((String)row[2]))  // for head in temp list
        {
            System.out.println("in first if");
            if(payincash1.containsKey((String)row[2]))     
            {
                System.out.println("map if repeat: "+payincash1);
                payincash1.put((String)row[2],tails);
            }

        } 
        else
        {

            System.out.println("map if not repeat: "+payincash1);
            payincash1.put((String)row[2], tails);

        }

    }
4

2 回答 2

1

收据的头列存储在哪里?在哪一栏?
在我看来,它也应该存储在数据库中。
假设头部信息保存在 DB 的“头部”列中,因此您应该更改查询,添加:

order by head

在最后。
之后,您应该遍历 Result,并可能将信息保存在如下所示的数据结构中:

Map<String,List<ReceiptInformation> map = new HashMap<>(); //using JDK7 syntax here

map 中的 key 应该是每次迭代中“head”的值。映射中的值应该是包含 ReceiptInfo 对象的 ArrayList(或任何其他实现 List 的类)。
ReceiptInfoObject 保存每条记录的所有其余值。
然后,您可以迭代 map.keySet() 集合,并为每个键打印头部,然后使用内部循环打印收据。

根据提出问题的用户的请求进行编辑:
为了添加新条目(即 - 新的 RecepitInformation 对象到地图),应该执行:

List<RecepitInformation> listForHead = map.get(headValue);
if (listForHead == null) {
   listForHead = new ArrayList<ReceiptInformation>();
   map.put(headValue,listForHead);
}
listForHead.add(recepitInformation);

像往常一样,我没有编译这个,但我认为它应该可以工作

于 2012-08-28T10:03:40.667 回答
1

使用GS Collections,您可以使用列表。groupBy (Function) 只要您的列表是MutableList。对于 JDK 列表,您可以使用Iterate.groupBy (Iterable, Function)。groupBy 的结果将是一个Multimap

于 2012-09-06T15:48:22.127 回答