<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

    搜索

    •  

    積分與排名

    • 積分 - 204253
    • 排名 - 283

    最新評論

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

    原文:
    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 閱讀(1618) 評論(0)  編輯  收藏 所屬分類: 報表設計與開發
    主站蜘蛛池模板: 国产日韩一区二区三免费高清| 久久丫精品国产亚洲av不卡| 免费爱爱的视频太爽了| 免费视频爱爱太爽了| 国产精成人品日日拍夜夜免费| 成人无码a级毛片免费| 中文在线观看免费网站| 99精品全国免费观看视频..| 91免费国产视频| 日本视频免费高清一本18| 久久这里只精品热免费99| 一级毛片在线免费看| 久久午夜夜伦鲁鲁片无码免费| 一级毛片成人免费看免费不卡| 1000部羞羞禁止免费观看视频| h视频在线免费看| 久久99九九国产免费看小说| 久久久久亚洲精品日久生情| 亚洲av永久无码精品漫画| 亚洲三级电影网址| 亚洲成AV人综合在线观看| 亚洲一卡二卡三卡四卡无卡麻豆| 亚洲AV成人影视在线观看 | 最近2019年免费中文字幕高清| 久久久免费精品re6| 免费毛片a在线观看67194| 中文字幕人成无码免费视频| 国产美女无遮挡免费视频 | 四虎影视永久免费观看地址| 国产一级一片免费播放| 全黄a免费一级毛片人人爱| 久久久久亚洲精品无码网址 | 四虎影视在线永久免费看黄| 亚洲福利精品一区二区三区| 亚洲精品午夜无码专区| 亚洲精品美女视频| 日本亚洲色大成网站www久久| 亚洲爆乳精品无码一区二区| 一级特黄色毛片免费看| 免费精品一区二区三区第35| 国产91色综合久久免费|