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:


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 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 {

 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 );