【发布时间】:2011-12-20 02:24:12
【问题描述】:
我正在使用 Jasper Reports 生成报告。
我正在使用临时表来生成报告,在创建临时表时我需要 JPA 使用的相同连接,我该如何实现。
【问题讨论】:
-
您的 JPA 是否设置为使用数据源?
标签: java jpa jasper-reports database-connection datasource
我正在使用 Jasper Reports 生成报告。
我正在使用临时表来生成报告,在创建临时表时我需要 JPA 使用的相同连接,我该如何实现。
【问题讨论】:
标签: java jpa jasper-reports database-connection datasource
也许你只有三步之遥。
您可以使用以下方式进行操作
将 JTA 数据源用于persistance.xml,如下所示
<persistence-unit name="sample">
<jta-data-source>java:comp/env/jdbc/DBConnectionDS</jta-data-source>
....
</persistence-unit>
为了生成报告,请从数据源中检索connection,如下所示
InitialContext initialContext = new InitialContext();
DataSource dataSource = (DataSource)initialContext.lookup("java:comp/env/jdbc/DBConnectionDS");
Connection connection = dataSource.getConnection();
使用连接生成如下报告:
JasperPrint print = JasperFillManager.fillReport(report, parameters, connection);
这应该就是我所相信的。这个想法是,为 JPA 和 JasperReport 使用通用 JNDI 连接,然后在适用的情况下使用它们。
我没有使用 JasperReports,但使用 BIRT Report 并以这种方式解决了它,没有任何问题。
【讨论】:
在 JasperReports 中,您可以使用原生 JDBC 查询或 EJBQL 查询。
使用后者时,您的代码应如下所示(来自JRJpaQueryExecuter api):
Map parameters = new HashMap();
EntityManager em = emf.createEntityManager();
parameters.put(JRJpaQueryExecuterFactory.PARAMETER_JPA_ENTITY_MANAGER, em);
JasperRunManager.runReportToPdfFile(fileName, parameters);
如果您确实需要底层 jdbc 连接,实现它的方式取决于您使用的 JPA 实现。
EclipseLink(JPA 2.0):
entityManager.getTransaction().begin();
java.sql.Connection connection = entityManager.unwrap(java.sql.Connection.class);
...
entityManager.getTransaction().commit();
(您无需开始和提交交易以进行报告)
【讨论】: