私は同じ問題を抱えており、例や説明は見つかりませんでしたが、その方法を見つけました。説明しますので、他の人がこのソリューションを使用できることを願っています。
以下のコードは 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);
}
});
java.util.Comparator パラメータ クラスを使用して、このような OVERRIDE_Comparator パラメータを jasperreport に追加します。
最終ステップ: $P{OVERRIDE_Comparator} を Comparator Expression として、必要な行/列グループに配置します。
このようなレポートをコンパイルする場合、最も可能性の高いコンパイル エラーはキャストの問題です。Jasperreports のデフォルトは java.lang.String です。レポートの xml を手動で編集して、各ステップで正しいクラスを取得する必要がある場合があります。
(私はアジアのサイトからこのメソッドを見つけました。ありがたいことに、コード自体は読み取り可能でした!:-))