Image you have an entity Project with a to-many relationship to ProjectStep. I wanted to present a report with rows for the projects and a sub report on each row listing the steps.
My solution was to create a getter in my Project EO:
public JRBeanCollectionDataSource theSteps() {
return new JRBeanCollectionDataSource( ERXArrayUtilities.sortedArraySortedWithKey(this.projectSteps(), "dueBy") );
}
of course I had to import into my Project EO:
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
now I can access my relation 'theSteps' in iReport as a Field. I can then pass the field to my sub report. The only downside was that if I had a attribute 'stepDescription' in my relationship, iReport was expecting there to be a getter getStepDescription.
so I added to my EO ProjectStep:
public String getStepDescription () {
return this.stepDescription();
}
and everyone was happy. I don't know if there is a way to get around the getter requirement.
There is a way around adding the accessors in the model. Assuming you have an entity called Person with a firstName and lastName attribute, you can create a source file called PersonBeanInfo.java with this content:
This means you can create and access fields in your Jasper .jrxml firstName and lastName, you do not need to create the getFirstName and getLastName accessors!
import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; import java.beans.SimpleBeanInfo; import java.util.ArrayList; import java.util.List; public class PersonBeanInfo extends SimpleBeanInfo { @Override public PropertyDescriptor[] getPropertyDescriptors() { try { List<PropertyDescriptor> list = new ArrayList<>(); list.add( new PropertyDescriptor( "firstName", Person.class, "firstName", "setFirstName" ) ); list.add( new PropertyDescriptor( "lastName", Person.class, "lastName", "setLastName" ) ); PropertyDescriptor[] array = new PropertyDescriptor[list.size()]; array = list.toArray( array ); return array; } catch( IntrospectionException e ) { throw new RuntimeException( e ); } } }