<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| 亚洲国产日韩在线成人蜜芽| 免费无遮挡无码永久视频| 亚洲AV午夜成人片| 日韩精品无码免费专区午夜 | 亚洲色图在线播放| 最近免费字幕中文大全| 亚洲精品乱码久久久久66| 国产99视频精品免费视频76| 亚洲美女高清一区二区三区| 一区二区三区AV高清免费波多| 亚洲av高清在线观看一区二区 | 国产成人A在线观看视频免费| 亚洲国产精品久久网午夜| 国产成人精品免费视频大全麻豆| 亚洲最大黄色网站| 成人啪精品视频免费网站| 亚洲1区2区3区精华液| 亚洲高清无码在线观看| 国产裸体美女永久免费无遮挡| 亚洲av综合色区| 精品无码免费专区毛片| 亚洲国产无线乱码在线观看| jjzz亚洲亚洲女人| 国产一级在线免费观看| 内射干少妇亚洲69XXX| 成人啪精品视频免费网站| 免费人成在线观看播放a| 国产A在亚洲线播放| 无遮免费网站在线入口| 日韩亚洲综合精品国产| 亚洲乱码国产一区三区| 日本三级2019在线观看免费| 四虎影视久久久免费观看| 亚洲AV无码成人专区片在线观看| 99久久国产热无码精品免费| 看免费毛片天天看| 亚洲人成电影在线天堂| 在线永久免费观看黄网站| 国产成人免费AV在线播放|