1

我想将子报告与 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(library) 中,我添加了子报表,我想为每个图书馆显示它包含的书籍列表;这是我的图书馆代码:

<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,没有会话或会话已关闭

谢谢你的帮助。

4

5 回答 5

1

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 控制器

(chain(controller:'jasper',action:'index',model:[data:data],params:params).
于 2010-04-30T06:28:13.987 回答
0

我发现问题:

在我的图书馆域中,我只是添加了一个带有 "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: failed to lazily initialize a collection - no session or session was closed

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

还有其他方法可以解决此问题吗?

于 2010-04-29T19:36:52.937 回答
0

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(无需急切获取)

于 2011-09-05T05:26:38.840 回答
0

我有一个 *.jasper(DataSource XML。我使用了 iReport)。如何通过它(书作为XML)?

预先感谢

于 2014-04-29T04:32:50.310 回答
0

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

于 2015-03-23T10:57:51.960 回答