Bonjour,
Pour ceux qui veulent utiliser hibernate avec jasperreport, voici un petit bout de code de mon cru bien utile.
Il s'agit simplment d'un JRDataSource adapaté à hibernate.
Il permet de retouver les propriètés imbriquées (components) (en utilisant "__" à la place du ".").
Il est également utile pour les sous-rapports (subreports) en mappant les collection vers un JRDataSource.
Code:
import java.lang.reflect.*;
import java.util.*;
import org.apache.commons.beanutils.*;
import org.apache.commons.logging.*;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.*;
import net.sf.jasperreports.engine.export.*;
import net.sf.jasperreports.engine.util.*;
import net.sf.jasperreports.view.*;
public class JRHibernateDataSource implements JRDataSource {
protected HashMap fieldsToIdxMap=new HashMap();
protected Iterator iterator;
protected Object currentValue;
public JRHibernateDataSource(Collection list) {
this.iterator = list.iterator();
}
public JRHibernateDataSource(Map list) {
this.iterator = list.values().iterator();
}
private Object nestedFieldValue(Object object, String field) {
Object value = null;
if (field.indexOf("__")>-1) {
try {
Method nestedGetter = PropertyUtils.getReadMethod(PropertyUtils.getPropertyDescriptor(object, field.substring(0,field.indexOf("__"))));
Object nestedObject = nestedGetter.invoke(object, null);
value=nestedFieldValue(nestedObject,field.substring(field.indexOf("__")+2,field.length()));
} catch (Exception ex) {
ex.printStackTrace();
}
} else {
try {
Method getter = PropertyUtils.getReadMethod(PropertyUtils.getPropertyDescriptor(object, field));
value = getter.invoke(object, null);
if(Collection.class.isAssignableFrom(getter.getReturnType())) {
return new JRHibernateDataSource((Collection)value);
}
if(Map.class.isAssignableFrom(getter.getReturnType())) {
return new JRHibernateDataSource((Map)value);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
return value;
}
public Object getCurrentValue() throws JRException {
return currentValue;
}
public Object getFieldValue(JRField field) throws JRException {
return nestedFieldValue(currentValue,field.getName());
}
public boolean next() throws JRException {
currentValue = iterator.hasNext() ? iterator.next() : null;
return currentValue != null;
}
Sébastien