(Resolvido) Ireport: SQL x HQL

3 respostas
rafa120

Bom dia a todos!

Como não tenho muito conhecimento em HQL eu prefiro usar o SQL para fazer a consulta no relatório.
Usando HLQ o relatório é gerado e quando tento colocar SQL, não funciona via aplicação. (A consulta direto com SQL no ireport traz os dados normalmente)

Onde estaria o erro?

Classe do relatório

public void reportBuilder() throws JRException {
        UsuarioDao usuarioDao = new UsuarioDaoImpl();
        List listaUs = usuarioDao.listaRelatorio();
        JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(listaUs);
        String report = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/reports/changetracker_users.jasper");
        jasperPrint = JasperFillManager.fillReport(report, new HashMap(), beanCollectionDataSource);
    }

DAO metodo HLQ

@Override
    public List listaRelatorio(){
        session = HibernateUtil.getSession();
        Query query = session.createQuery("from Usuario");
        List listaUs = query.list();
        return listaUs;
    }

DAO metodo SQL

public List listaRelatorio() {

session = HibernateUtil.getSession();
    SQLQuery sqlquery = session.createSQLQuery("SELECT u.username, u.name, t.team FROM usuario u "
                + "INNER JOIN team t ON u.id_team = t.id_team ORDER BY name ASC");    
    List listaUs = sqlquery.list();  
    return listaUs;
}

ERRO quando uso com o método em SQL:

Grave: 'net.sf.jasperreports.engine.JRException' recebido ao invocar escuta de ação '#{usuarioBean.exportToPdf}' para o componente 'exportToPdfButton'
Grave: net.sf.jasperreports.engine.JRException: Error retrieving field value from bean : username
	at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getBeanProperty(JRAbstractBeanDataSource.java:123)
	at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getFieldValue(JRAbstractBeanDataSource.java:96)
	at net.sf.jasperreports.engine.data.JRBeanCollectionDataSource.getFieldValue(JRBeanCollectionDataSource.java:100)
Caused by: java.lang.NoSuchMethodException: Unknown property 'username' on class 'class [Ljava.lang.Object;'

3 Respostas

pmlm

Ao utilizadores HQL, a tua lista é de elementos Usuario, pelo que obter a propriedade “username” de uma entrada da lista devolve o valor correto.

Com sql, a lista contem um array de objetos, com os valores das tuas colunas e sem qualquer nome associado e assim, username é uma propriedade desconhecida da lista de objetos. Neste caso tens de dizer qual e a entidade ou mapear o teu resultado.

rafa120

Desculpe, não entendi.

O que quero é obter os dados de username, name e team(vem de outra tabela) via SQL e nao HLQ.

Achei este exemplo:

DAO

public static Connection getConnection() throws HibernateException, SQLException{
        return new AnnotationConfiguration().configure().buildSettings().getConnectionProvider().getConnection();
        
    }

Report

JasperReport pathRxml = JasperCompileManager.compileReport(layout/reportcamilo.jrxml);
JasperPrint printReport = JasperFillManager.fillReport(pathRxml, null, DAO.getConnection());
JasperExportManager.exportReportToPdfFile(printReport, reportexcamilo.pdf);

Mas me gera o erro nesta linha do DAO:
return new AnnotationConfiguration().configure().buildSettings().getConnectionProvider().getConnection();

ERRO:

no suitable method found for buildSettings(no arguments)

method Configuration.buildSettings(ServiceRegistry) is not applicable

(actual and formal argument lists differ in length)

method Configuration.buildSettings(Properties,ServiceRegistry) is not applicable

(actual and formal argument lists differ in length

Será algum erro na configuracao do meu HibernateUtil?

rafa120

Resolved.

alterado de HLQ para SQL:

//JDBC
Conexao conn = new Conexao();
String report = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/reports/users.jrxml"); //Use jrxml, not .jasper
JasperReport pathjrxml = JasperCompileManager.compileReport(report);
jasperPrint = JasperFillManager.fillReport(pathjrxml, null, conn.getConn()); //getting JDBC connection


//list HLQ
UsuarioDao usuarioDao = new UsuarioDaoImpl();
List listaUs = usuarioDao.listaRelatorio();
JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(listaUs);
String report = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/reports/users.jasper");
jasperPrint = JasperFillManager.fillReport(report, new HashMap(), beanCollectionDataSource);
Criado 5 de abril de 2016
Ultima resposta 10 de abr. de 2016
Respostas 3
Participantes 2