繁体   English   中英

如何在Grails Jasper插件中使用jasperreports子报表?

[英]How to use jasperreports subreports with grails jasper plugin?

我想将子报表与grails jasper插件一起使用,我在此URL( http://www.grails.org/plugin/jasper )上遵循了手册。 这是我的代码:

领域书:

class Book {

  static belongsTo = Library

    Library library

    String title
    String author
    String publisher
    String category

    static constraints={
        title()
        author()
        publisher()
        category()
    }
}

域库:

class Library {

  static hasMany = [ books : Book ]

  String name
  String adresse
  Date dateMaturity

    static constraints = {
    }

        String toString()
    {
        return name
    }
}

在我的BookController中,我有:

def createReport = {
    def books = Book.list()
    chain(controller:'jasper',action:'index',model:[data:books],params:params)
}

在我的LibraryController中,我有:

def createReport = {
    def library = Library.list()
    chain(controller:'jasper',action:'index',model:[data:library],params:params)
}

我的碧玉部分是:

我有一个SubReport文件:books.jasper(获取书籍列表)。
也是MasterReport:library.jasper(获取库列表)。

在我的MasterReport(库)中,我添加了子报表,我希望针对每个图书馆,显示其中包含的图书清单; 这是我的图书馆代码:

<parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
...
<field name="books" class="java.util.Collection"/>
...
<subreport isUsingCache="true">
<reportElement x="0" y="25" width="437" height="100"/>
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{books})]]></dataSourceExpression>
<subreportExpression class="java.lang.String"><![CDATA[$P{SUBREPORT_DIR} + "books.jasper"]]>
</subreportExpression>
</subreport>

我有这个错误:

错误500:在插件[jasper]中执行控制器[JasperController]的操作[index]导致异常:net.sf.jasperreports.engine.fill.JRExpressionEvalException:错误评估表达式:源文本:新的net.sf.jasperreports.engine.data .JRBeanCollectionDataSource($ F {books})
异常消息:无法延迟初始化角色集合:bookshelf.Library.books,没有会话或会话被关闭

谢谢你的帮助。

Jasper报告只需要对象列表。 它不理解GORM查询。 因此,我们的方法是创建一个单独的对象列表,将其命名为“查看对象”,然后将其发送到jasper报告而不是域类。

 class LibraryVO {
   List books
   String name
   String adresse
   Date dateMaturity
  }

 class bookVO {
  String title
    String author
    String publisher
    String category
  }

您可以像这样初始化列表

 List data=[]

 LibraryVo libVo= new LibraryVO(...) // inalise it here
 libVo.books = [new BookVO(),new BookVO()]

 data << libVO

并将列表传递给Jasper Controller

(chain(controller:'jasper',action:'index',model:[data:data],params:params).

我有一个* .jasper(数据源XML。我使用了iReport)。 如何传递它(作为XML的书)?

预先感谢

我发现问题:

在我的图书馆域中,我只添加了一个带有“ books lazy:false”的映射:

class Library {

  static hasMany = [ books : Book ]

  String name
  String adresse
  Date dateMaturity

    static constraints = {
    }

    static mapping = {
    books lazy: false
  }

        String toString()
    {
        return name
    }
}

现在,我有麻烦的报告了!


grails jasper插件使用链将模型从一个动作链接到另一个动作( chain(controller:'jasper',action:'index',model:[data:library],params:params )。

之后,在jasper控制器中,我们通过以下代码获取模型:

def testModel = this.getProperties().containsKey('chainModel')?chainModel:null

由于某种原因,在图书馆藏书中,我们在书单上有一个错误,例如:org.hibernate.LazyInitializationException:无法延迟初始化藏书-没有会话或会话被关闭

通过使用“ lazy:false”,我们提取域类的所有其他实例。

还有另一种方法可以解决此问题?

您可以使用jasper报告来调用gorm,但是您需要将报告的语言设置常规而不是Java,因为它是默认语言。 然后,如果您使用子报表,则需要禁用jasper报表多线程并添加其他jar。 完美地工作了。

LazyInitializationException是因为testModel中的对象未附加到当前的休眠会话。 我只是通过如下方式入侵JasperController来解决这个问题:

class JasperController {
    JasperService jasperService

    // We need this to access the current hibernate session
    def sessionFactory

    def index = {
        println(params)

        def testModel = this.getProperties().containsKey('chainModel') ? chainModel : null

        // Re-attach model objects to avoid LazyInitializationException.
        def session = sessionFactory.getCurrentSession()
        testModel?.data?.each
        {
            session.update(it)
        }

        JasperReportDef report = jasperService.buildReportDefinition(params,            request.getLocale(), testModel)
        generateResponse(report)
    }

... 等等。 这样就重新附加了模型对象,从而避免了LIE(不必急于获取)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM