<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 251  文章 - 504  trackbacks - 0
    <2006年6月>
    28293031123
    45678910
    11121314151617
    18192021222324
    2526272829301
    2345678

    本博客系個人收集材料及學習記錄之用,各類“大俠”勿擾!

    留言簿(14)

    隨筆分類

    收藏夾

    My Favorite Web Sites

    名Bloger

    非著名Bloger

    搜索

    •  

    積分與排名

    • 積分 - 202529
    • 排名 - 285

    最新評論

    注: 此方法使用簡單,但是沒有分頁讀取數據,適合數據量不大情況下的報表

    原文:
    http://www.hibernate.org/79.html

    Using JasperReports with Hibernate
    This section will demonstrate a couple of ways to use the results of a Hibernate query as the datasource of a report in JasperReports.

    When the Hibernate query returns a simple collection of objects, The JRBeanCollectionDataSource class in the JasperReports library will work fine.

    --------------------------------------------------------------------------------------------------------
    List cats = session.find("from eg.Cat");

    Map parameters = new HashMap();
    parameters.put("Title", "The Cat Report");

    InputStream reportStream = this.class.getResourceAsStream("/the-cat-report.xml");
    JasperDesign jasperDesign = JasperManager.loadXmlDesign(reportStream);
    JasperReport jasperReport = JasperManager.compileReport(jasperDesign);

    JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(cats);
    JasperPrint jasperPrint = JasperManager.fillReport(jasperReport, parameters, ds);

    JasperManager.printReportToPdfFile(jasperPrint, "the-cat-report.pdf");

    --------------------------------------------------------------------------------------------------------

    ? However, when the Hibernate query returns tuples of objects (each tuple as an array, each array as an element in the returned List), things get a little tricky. Jasper needs a way to reference each object in the array by a field name. This class is a good solution, but at this time you are required to pass an array of field names matching the results of the query.

    --------------------------------------------------------------------------------------------------------
    public class HibernateQueryResultDataSource implements JRDataSource {

    private String[] fields;
    private Iterator iterator;
    private Object currentValue;

    public HibernateQueryResultDataSource(List list, String[] fields) {
    ? this.fields = fields;
    ? this.iterator = list.iterator();
    }

    public Object getFieldValue(JRField field) throws JRException {
    ? Object value = null;
    ? int index = getFieldIndex(field.getName());
    ? if (index > -1) {
    ? ? Object[] values = (Object[])currentValue;
    ? ? value = values[index];
    ? }
    ? return value;
    }

    public boolean next() throws JRException {
    ? currentValue = iterator.hasNext() ? iterator.next() : null;
    ? return (currentValue != null);
    }

    private int getFieldIndex(String field) {
    ? int index = -1;
    ? for (int i = 0; i < fields.length; i++) {
    ? ? if (fields
    .equals(field)) {
    ? ? index = i;
    ? ? break;
    ? ? }
    ? }
    ? return index;
    }

    }

    --------------------------------------------------------------------------------------------------------

    Now running your report would look something like this:


    --------------------------------------------------------------------------------------------------------
    List cats = session.find("select cat.type, cat.birthdate, cat.name from eg.DomesticCat cat");

    Map parameters = new HashMap();
    parameters.put("Title", "The Cat Report");

    InputStream reportStream = this.class.getResourceAsStream("/the-cat-report.xml");
    JasperDesign jasperDesign = JasperManager.loadXmlDesign(reportStream);
    JasperReport jasperReport = JasperManager.compileReport(jasperDesign);

    String[] fields = new String[] { "type", "birthdate", "name"};
    HibernateQueryResultDataSource ds = new HibernateQueryResultDataSource(cats, fields);
    JasperPrint jasperPrint = JasperManager.fillReport(jasperReport, parameters, ds);

    JasperManager.printReportToPdfFile(jasperPrint, "the-cat-report.pdf");

    --------------------------------------------------------------------------------------------------------


    Another, alternate implementation, from Erik Romson:


    --------------------------------------------------------------------------------------------------------
    public class HibernateQueryResultDataSource implements JRDataSource
    {
    ? private static final transient Logger logger =
    ? ? Logger.Factory.getInstance(HibernateQueryResultDataSource.class);
    ? protected HashMap fieldsToIdxMap=new HashMap();
    ? protected Iterator iterator;
    ? protected Object currentValue;
    ? List values;

    ? public HibernateQueryResultDataSource(List list, String query)
    ? {
    ? ? int start =query.indexOf("select ");
    ? ? int stop =query.indexOf(" from ");
    ? ? Assertion.assertTrue(
    ? ? ? (start!=-1) &&
    ? ? ? (stop!=-1),
    ? ? ? "The query "+
    ? ? ? query+
    ? ? ? " must be of the form select x,x from ..."
    ? ? );
    ? ? start+="select".length();
    ? ? String parameters=query.substring(start,stop);
    ? ? parameters=parameters.trim();
    ? ? Assertion.assertTrue(
    ? ? ? ? parameters.length()>0,
    ? ? ? ? "The query "+
    ? ? ? ? query+
    ? ? ? ? " seems to be weird"
    ? ? );
    ? ? StringTokenizer tokenizer=new StringTokenizer(parameters,",");
    ? ? int idx=0;
    ? ? while( tokenizer.hasMoreTokens() )
    ? ? {
    ? ? ? ? String parameter=tokenizer.nextToken();
    ? ? ? ? fieldsToIdxMap.put( parameter.trim(), new Integer(idx) );
    ? ? ? ? idx++;
    ? ? }
    ? ? values=list;
    ? ? this.iterator = list.iterator();
    ? }
    public Object getFieldValue(JRField field) throws JRException
    ? {
    ? ? String fieldName=field.getName().replace('_','.');
    ? ? //JasperReports does not allow '.' in field names, so we
    ? ? //use '_' for nested properties instead and must convert here
    ? ? //(comment added by kbrown)
    ? ? Integer idxInt=(Integer) fieldsToIdxMap.get(fieldName);
    ? ? if (idxInt==null)
    ? ? {
    ? ? ? ? Assertion.fail(
    ? ? ? ? ? "The field \""+
    ? ? ? ? ? fieldName+
    ? ? ? ? ? "\" did not have an index mapping. Should be one off "+
    ? ? ? ? ? fieldsToIdxMap.keySet()
    ? ? ? ? );
    ? ? }
    ? ? Object[] values = (Object[]) currentValue;
    ? ? Assertion.assertTrue(
    ? ? ? ? idxInt.intValue()
    ? ? ? ? "The index from field "+
    ? ? ? ? fieldName+
    ? ? ? ? " was illegal"
    ? ? );
    ? ? Object value= values[ idxInt.intValue() ];
    ? ? if ( logger.isDebugEnabled() )
    ? ? {
    ? ? ? ? logger.debug("fetched value "+value+" from field "+fieldName);
    ? ? }
    ? ? return value;
    ? }

    ? public boolean next() throws JRException
    ? {
    ? ? currentValue = iterator.hasNext() ? iterator.next() : null;
    ? ? return currentValue != null;
    ? }

    ? public List getValues()
    ? {
    ? ? return values;
    ? }
    }

    --------------------------------------------------------------------------------------------------------

    Using JasperReports with Hibernate
    This section will demonstrate a couple of ways to use the results of a Hibernate query as the datasource of a report in JasperReports.

    When the Hibernate query returns a simple collection of objects, The JRBeanCollectionDataSource class in the JasperReports library will work fine.

    List cats = session.find("from eg.Cat");

    Map parameters = new HashMap();
    parameters.put("Title", "The Cat Report");

    InputStream reportStream = this.class.getResourceAsStream("/the-cat-report.xml");
    JasperDesign jasperDesign = JasperManager.loadXmlDesign(reportStream);
    JasperReport jasperReport = JasperManager.compileReport(jasperDesign);

    JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(cats);
    JasperPrint jasperPrint = JasperManager.fillReport(jasperReport, parameters, ds);

    JasperManager.printReportToPdfFile(jasperPrint, "the-cat-report.pdf");
    However, when the Hibernate query returns tuples of objects (each tuple as an array, each array as an element in the returned List), things get a little tricky. Jasper needs a way to reference each object in the array by a field name. This class is a good solution, but at this time you are required to pass an array of field names matching the results of the query.

    public class HibernateQueryResultDataSource implements JRDataSource {

    private String[] fields;
    private Iterator iterator;
    private Object currentValue;

    public HibernateQueryResultDataSource(List list, String[] fields) {
    ? this.fields = fields;
    ? this.iterator = list.iterator();
    }

    public Object getFieldValue(JRField field) throws JRException {
    ? Object value = null;
    ? int index = getFieldIndex(field.getName());
    ? if (index > -1) {
    ? ? Object[] values = (Object[])currentValue;
    ? ? value = values[index];
    ? }
    ? return value;
    }

    public boolean next() throws JRException {
    ? currentValue = iterator.hasNext() ? iterator.next() : null;
    ? return (currentValue != null);
    }

    private int getFieldIndex(String field) {
    ? int index = -1;
    ? for (int i = 0; i < fields.length; i++) {
    ? ? if (fields
    .equals(field)) {
    ? ? index = i;
    ? ? break;
    ? ? }
    ? }
    ? return index;
    }

    }
    Now running your report would look something like this:

    List cats = session.find("select cat.type, cat.birthdate, cat.name from eg.DomesticCat cat");

    Map parameters = new HashMap();
    parameters.put("Title", "The Cat Report");

    InputStream reportStream = this.class.getResourceAsStream("/the-cat-report.xml");
    JasperDesign jasperDesign = JasperManager.loadXmlDesign(reportStream);
    JasperReport jasperReport = JasperManager.compileReport(jasperDesign);

    String[] fields = new String[] { "type", "birthdate", "name"};
    HibernateQueryResultDataSource ds = new HibernateQueryResultDataSource(cats, fields);
    JasperPrint jasperPrint = JasperManager.fillReport(jasperReport, parameters, ds);

    JasperManager.printReportToPdfFile(jasperPrint, "the-cat-report.pdf");

    --------------------------------------------------------------------------------

    Another, alternate implementation, from Erik Romson:

    public class HibernateQueryResultDataSource implements JRDataSource
    {
    ? private static final transient Logger logger =
    ? ? Logger.Factory.getInstance(HibernateQueryResultDataSource.class);
    ? protected HashMap fieldsToIdxMap=new HashMap();
    ? protected Iterator iterator;
    ? protected Object currentValue;
    ? List values;

    ? public HibernateQueryResultDataSource(List list, String query)
    ? {
    ? ? int start =query.indexOf("select ");
    ? ? int stop =query.indexOf(" from ");
    ? ? Assertion.assertTrue(
    ? ? ? (start!=-1) &&
    ? ? ? (stop!=-1),
    ? ? ? "The query "+
    ? ? ? query+
    ? ? ? " must be of the form select x,x from ..."
    ? ? );
    ? ? start+="select".length();
    ? ? String parameters=query.substring(start,stop);
    ? ? parameters=parameters.trim();
    ? ? Assertion.assertTrue(
    ? ? ? ? parameters.length()>0,
    ? ? ? ? "The query "+
    ? ? ? ? query+
    ? ? ? ? " seems to be weird"
    ? ? );
    ? ? StringTokenizer tokenizer=new StringTokenizer(parameters,",");
    ? ? int idx=0;
    ? ? while( tokenizer.hasMoreTokens() )
    ? ? {
    ? ? ? ? String parameter=tokenizer.nextToken();
    ? ? ? ? fieldsToIdxMap.put( parameter.trim(), new Integer(idx) );
    ? ? ? ? idx++;
    ? ? }
    ? ? values=list;
    ? ? this.iterator = list.iterator();
    ? }

    ? public Object getFieldValue(JRField field) throws JRException
    ? {
    ? ? String fieldName=field.getName().replace('_','.');
    ? ? //JasperReports does not allow '.' in field names, so we
    ? ? //use '_' for nested properties instead and must convert here
    ? ? //(comment added by kbrown)
    ? ? Integer idxInt=(Integer) fieldsToIdxMap.get(fieldName);
    ? ? if (idxInt==null)
    ? ? {
    ? ? ? ? Assertion.fail(
    ? ? ? ? ? "The field \""+
    ? ? ? ? ? fieldName+
    ? ? ? ? ? "\" did not have an index mapping. Should be one off "+
    ? ? ? ? ? fieldsToIdxMap.keySet()
    ? ? ? ? );
    ? ? }
    ? ? Object[] values = (Object[]) currentValue;
    ? ? Assertion.assertTrue(
    ? ? ? ? idxInt.intValue()
    ? ? ? ? "The index from field "+
    ? ? ? ? fieldName+
    ? ? ? ? " was illegal"
    ? ? );
    ? ? Object value= values[ idxInt.intValue() ];
    ? ? if ( logger.isDebugEnabled() )
    ? ? {
    ? ? ? ? logger.debug("fetched value "+value+" from field "+fieldName);
    ? ? }
    ? ? return value;
    ? }

    ? public boolean next() throws JRException
    ? {
    ? ? currentValue = iterator.hasNext() ? iterator.next() : null;
    ? ? return currentValue != null;
    ? }

    ? public List getValues()
    ? {
    ? ? return values;
    ? }
    }

    --------------------------------------------------------------------------------

    Using the information from this page I've made a patch to JasperReports 0.6.5. You can find the patch at:
    http://www.waltermourao.com.br/JasperReports/jr65_hql.zip or you can download the full version from: http://www.waltermourao.com.br/JasperReports/jasperreports-hql-0.6.5.zip

    posted on 2006-06-29 19:58 matthew 閱讀(1612) 評論(0)  編輯  收藏 所屬分類: 報表設計與開發
    主站蜘蛛池模板: 久久久久久久久免费看无码| 成在人线av无码免费高潮水| 国产亚洲综合成人91精品 | 精品香蕉在线观看免费| 亚洲国产成人一区二区三区| 亚洲免费综合色在线视频| 97国产免费全部免费观看| 亚洲小说区图片区| 老司机午夜性生免费福利 | 最近免费视频中文字幕大全| 免费永久看黄在线观看app| 久久无码av亚洲精品色午夜| 免费一级毛片在线观看| 一个人看的www视频免费在线观看| 18禁止看的免费污网站| 亚洲人成国产精品无码| jizz免费观看视频| 国产成人综合久久精品免费| 四虎国产精品永免费| 亚洲码国产精品高潮在线| 爱情岛亚洲论坛在线观看| 无码国产精品一区二区免费 | 91亚洲国产成人久久精品| 黄色视频在线免费观看| 成年美女黄网站18禁免费 | 亚洲精品视频在线观看免费| 国产精品无码永久免费888| 国产亚洲精品自在久久| 96免费精品视频在线观看| 中国亚洲呦女专区| 国产亚洲成归v人片在线观看| 无码一区二区三区免费| 亚洲av永久无码精品天堂久久| 国产自产拍精品视频免费看| 亚洲一级片免费看| 亚洲嫩草影院在线观看| 免费国产小视频在线观看| 日本在线看片免费人成视频1000| 狠狠综合久久综合88亚洲| 日本激情猛烈在线看免费观看| 久久精品国产96精品亚洲 |