Сложные отчеты с JPA и JasperReports - PullRequest
       8

Сложные отчеты с JPA и JasperReports

2 голосов
/ 30 сентября 2010

Я составлял отчеты с помощью jasperreports и JPA, все эти отчеты - это просто «каталоги», в которых единственной информацией является сущность или несколько раз сущность со связанными сущностями.

Теперь мне нужно создавать отчетыс очень сложной информацией (группировка, суммирование, поля, не являющиеся частью сущности и т. д.), что невозможно с моими сущностями (да, я знаю, что могу изменить свой дизайн, но я не думаю, что это хорошо для моего приложения).

Я думал о разных альтернативах, таких как передача соединения jdbc, даже если это подразумевает создание методов в моих классах для передачи этого объекта в представление (которое генерирует отчет).

Другой - создать еще один контекст (приложение), который будет обращаться к базе данных по-своему (что-то вроде BI), поэтому это приложение будет отделено от моего исходного приложения.

Надеюсь, что кто-то может прокомментировать или дать мнелучший способ добиться этого.

Кстати, моя основа это весна.

Спасибо.

1 Ответ

2 голосов
/ 01 октября 2010

Я бы рекомендовал использовать опцию соединения JDBC при создании сложного отчета, хотя бы только для гибкости, получаемой при написании SQL-кода напрямую. Но наличие вторжения JDBC-соединения в слой представления не очень хорошо звучит, поэтому, не зная ничего о Spring, я скажу переместить фактическое создание отчета вниз на уровень обслуживания, чтобы он возвращал объект JasperPrint (который сериализуем) на уровень представления, где это может быть представлено.

Вот пример простого ванильного RMI, в значительной степени, как я это делаю. Я полагаю, это можно перевести в какой-нибудь Spring bean-компонент.

public interface ReportService extends Remote {
  public JasperPrint fillReport(final JasperReport report, final Map reportParameters)throws RemoteException, JRException;
}

public class ReportServiceImpl implements ReportService {

  final Connection connection;

  public ReportServiceImpl(final Connection connection) {
    this.connection = connection;
  }

  public JasperPrint fillReport(final JasperReport report, final Map reportParameters) throws RemoteException, JRException {
    return JasperFillManager.fillReport(report, reportParameters, connection);
  }
}

Одна из модификаций, которая приходит на ум, без намерений каламбура, состоит в том, чтобы метод fillReport принимал имя отчета или путь в качестве аргумента вместо фактического объекта JasperReport, и чтобы служебный уровень загружал его (и кэшировал его после загрузки отчет является относительно дорогой операцией).

Дайте мне знать, если вы хотите, чтобы я конкретизировал некоторые части этого примера, я должен предупредить вас, что я программист на настольных компьютерах и Swing, имея лишь элементарный опыт работы с веб-интерфейсами.

...