У меня была такая же проблема, и я не нашел ни примеров, ни объяснений, но я нашел, как это сделать. Я объясню, так что, надеюсь, другие люди могут использовать это решение.
Я использовал приведенный ниже код для jasperreports 3.1.0 и iReport 3.1.4, но, думаю, он работает практически для всех версий.
Сначала вам нужно убедиться, что вы знаете, какой у вас класс в выражении группы для вашей группы строк / столбцов. По умолчанию это java.lang.String, но у меня там есть свой класс. Чтобы это работало, мне нужно было отредактировать xml следующим образом для моей группы столбцов:
<bucketExpression class="java.lang.String"><![CDATA[$F{customObj}]]></bucketExpression>
до
<bucketExpression class="com.project.CustomObj"><![CDATA[$F{customObj}]]></bucketExpression>
Очевидно, что это значение customObj является полем с соответствующим классом, определенным в самом отчете.
Затем вам нужно добавить Comparator в качестве параметра, например:
parameters.put("OVERRIDE_Comparator", new Comparator<CustomObj>() {
public int compare(CustomObj c1, CustomObj c2) {
//create your custom compare logic over here, this code works as if no custom Comparator is used
return c1.compareTo(c2);
}
});
Теперь добавьте такой параметр OVERRIDE_Comparator в jasperreport, используя класс параметров java.util.Comparator.
Последний шаг: поместите $ P {OVERRIDE_Comparator} в качестве выражения компаратора в нужную вам группу строк / столбцов.
При компиляции такого отчета наиболее вероятной ошибкой компиляции будут проблемы приведения. Jasperreports по умолчанию равен java.lang.String. Возможно, вам придется вручную редактировать xml отчета, чтобы получить правильный класс на каждом шаге.
(я узнал этот метод с какого-то азиатского сайта, к счастью, сам код был читабелен! :-))