Duvida com ireport + sub-relatorio

Bom dia caros colegas, mais uma vez estou por aqui precisando de uma focinha de vcs, estou desenvolvendo um relatório para o balanço financeiro usando o ireport, nesse relatório preciso usar alguns sub-relatórios, eu fiz o relatório principal e sub-relatório executei o mesmo dentro da ferramenta do ireport esta tudo ok. A minha duvida é o seguinte para o relatório principal eu passo a query via programação e a do sub-relatório eu tbm preciso passa via programação mas não sei como chamar e passa a query do sub-relatório. Abaixo eu tenho o modelo do método que utilizo para passa a query para o relatório principal como ficaria para passa a query do sub-relatórios e como eu chamaria o mesmo. Esse método eu chamo só o relatório principal mas não sei como chamar e passa o query para o sub-relatorio.

public class RelatBalancoFinanceiro extends GenericDAO {

    Connection con = ConnectionFactory.getConnection();
    String query;

    public void reportBalancoFinanceiro(Date dt_ini, Date dt_fim) {


                    query = "select * from xxxx";

            }

            Map parametros = new HashMap();
            parametros.put("titulo", titulo);
            parametros.put("data", data);
            parametros.put("vencimento", vencimento);

            JRResultSetDataSource jrRS = new JRResultSetDataSource(con.createStatement().executeQuery(query));
            JasperPrint jasperPrint = JasperFillManager.fillReport(
                    "src/Relatorios/MovdeContas/reportBalancoFinanceiro.jasper",
                    parametros,
                    jrRS);

            if (!jasperPrint.getPages().isEmpty()) {
                JasperViewer jv = new JasperViewer(jasperPrint, false);
                jv.setVisible(true);
                jv.setTitle("Relatorio Balanco Financeiro"); //Coloca titulo 
            } else {
                JOptionPane.showMessageDialog(null, "Não existe lançamento neste período",
                        "Aviso", JOptionPane.INFORMATION_MESSAGE);
            }
        } catch (JRException ex) {
            Logger.getLogger(RelatContasPagar.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Erro ao gerar relatorio",
                    "Erro", JOptionPane.ERROR);
        }
    }
}