HQL: Aliais não consegue setar a coluna de outro aliais ou tabela

Boa tarde a todos,
estou tendo problemas na minha consulta HQL:

public List<Material> consultaMaterialUnidadeHQL(String unidade) {
        Session session;
        if (em.getDelegate() instanceof EntityManagerImpl) {
            EntityManagerImpl entityManagerImpl = (EntityManagerImpl) em.getDelegate();
            session = entityManagerImpl.getSession();
        } else {
            session = (Session) em.getDelegate();
        }
        Criteria crit = session.createCriteria(Material.class);


        String sql = "SELECT MATERIAL.TITULO as titulo,CLIENTE.CLIENTE as cliente,MATERIAL.DUARACAO as duracao,MATERIAL.xdcam as xdcam,  \n"
                + "TO_CHAR(MATERIAL.DATAMATERIAL,'DD/MM/YYYY HH24:MI') as dataMaterial,MATERIAL.STATUSOPEC as statusOPEC,MATERIAL.STATUSENG as statusEng \n"
                + "FROM MATERIAL \n"
                + "JOIN UNIDADE ON MATERIAL.ID_UNIDADEORIGEM = UNIDADE.ID_UNIDADE \n"
                + "JOIN CLIENTE ON MATERIAL.ID_CLIENTE = CLIENTE.ID_CLIENTE \n"
                + "WHERE UNIDADE.UNIDADE = :unidadeHQL \n"
                + "ORDER BY MATERIAL.DATAMATERIAL DESC";
        SQLQuery query = session.createSQLQuery(sql);
        query.addScalar("titulo", Hibernate.STRING);
        query.addScalar("cliente", Hibernate.STRING);
        query.addScalar("duracao", Hibernate.STRING);
        query.addScalar("xdcam", Hibernate.STRING);
        query.addScalar("dataMaterial", Hibernate.STRING);
        query.addScalar("statusOPEC", Hibernate.STRING);
        query.addScalar("statusEng", Hibernate.STRING);
        query.setParameter("unidadeHQL", unidade);
        query.setResultTransformer(Transformers.aliasToBean(Material.class));

        List<Material> resultado = query.list();
        crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        return resultado;
    }

o erro é o seguinte:

Caused by: java.lang.IllegalArgumentException: argument type mismatch

provavelmente é a coluna cliente, que na minha entidade material é um Objeto Cliente.
Já tentei mudar de:

 query.addScalar("cliente", Hibernate.STRING);

para:

 query.addScalar("cliente", Hibernate.OBJECT);

mais não adiantou, alguém poderia me ajudar?

Alguém poderia me ajudar?

verifique o tipo (STRING, INT, etc.) no BD com o que você está enviando para lá se são do mesmo tipo…

Eu ja verifiquei mais o erro persistem e quando não é esse erro é esse aqui:

java.lang.UnsupportedOperationException: object is a multicolumn type

Quero transferir essa consulta:

public List<Material> consultaMaterialUnidade(String unidade) {
        Session session;
        if (em.getDelegate() instanceof EntityManagerImpl) {
            EntityManagerImpl entityManagerImpl = (EntityManagerImpl) em.getDelegate();
            session = entityManagerImpl.getSession();
        } else {
            session = (Session) em.getDelegate();
        }
        Criteria crit = session.createCriteria(Material.class);
        crit.createAlias("unidade", "u");
        crit.add(Restrictions.eq("u.unidade", unidade));
        crit.addOrder(Order.desc("dataMaterial"));
        crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        return crit.list();
    }

para HQL, minha entidade material:

private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "material_seq")
    @Column(name = "id")
    private Long id;
    @Column(name = "titulo")
    private String titulo;
    @Column(name = "loudness")
    private String loudness;
    @Column(name = "codMaterial")
    private String codMaterial;
    @Column(name = "ancine")
    private String ancine;
    @Column(name = "duaracao")
    private String duracao;
    @Column(name = "clip")
    private String clip;
    @Column(name = "geradora")
    private String geradora;
    @Column(name = "dataMaterial", updatable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date dataMaterial;
    @Column(name = "dataVencimento", updatable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date dataVencimento;
    @Column(name = "numeroMidia")
    private String numeroMidia;
    @Column(name = "statusENG")
    private String statusEng;
    @Column(name = "statusOPEC")
    private String statusOPEC;
    @Column(name = "grauDeteoriza")
    private String grauDeteoriza;
    @Column(name = "incidencia")
    private String incidencia;
    @Column(name = "gerado")
    private Boolean gerado = false;
    @Column(name = "geradoRessalva")
    private Boolean geradoRessalva;
    @Column(name = "recebido")
    private Boolean recebido;
    @Column(name = "observacaoOpe")
    private String observacaoOpe;
    @Column(name = "observacaoEng")
    private String observacaoEng;
    @Column(name = "observacaoCli")
    private String observacaoCli;
    @Column(name = "observacaoOpeRep")
    private String observacaoOpeRep;
    @Column(name = "Autorizacao")
    private String autorizacao;
    @Column(name = "pendencia")
    private String pendencia;
    @Column(name = "juPendencia")
    private Boolean juPendencia = false;
    private String observaocaoReprova;
    private Boolean confirmaGravacaoProg = false;
    private Boolean cancelaGravacaoProg = false;
    private String observacaoCancelaGravacaoProg;
    private Boolean solicitaGravacao = false;
    private String xdcam;
    private Boolean mantemMaterialDisco = false;
    //@ManyToOne----------------------------------------------------------------
    @ManyToOne
    @JoinColumn(name = "id_pendencia")
    private Usuario usuPendencia;
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "id_produtora")
    private Produtora produtora;
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "id_cliente")
    private Cliente cliente;
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "id_unidadeorigem")
    private Unidade unidade;
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "id_midia")
    private Midia midia;
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "id_OperadorEng")
    private Usuario operadorEng;
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "id_operador")
    private Usuario operador;
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "id_discomaterial")
    private DiscoMaterial discoMaterial;
    //--------------------------------------------------------------------------
    //@OneToMany ---------------------------------------------------------------  
    @OneToMany(mappedBy = "material", fetch = FetchType.LAZY, cascade = CascadeType.ALL, targetEntity = Geracao.class)
    private List<Geracao> geracoes;
    //--------------------------------------------------------------------------
    //@OneToOne-----------------------------------------------------------------
    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL, targetEntity = IrregularidadeComercial.class)
    private IrregularidadeComercial irregularidadeComercial;

e minha entidade cliente é:

 @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "cliente_seq")
    @Column(name = "id_cliente")
    private Long id;
    @Column(name = "cliente")
    private String cliente;
    @Column(name = "telefone")
    private String telefone;
    @Column(name = "contato")
    private String contato;
    @OneToMany(mappedBy = "cliente", cascade = CascadeType.ALL, fetch = FetchType.LAZY, targetEntity = Material.class)
    private List<Material> materials;

e até agora eu estou nesse ponto com minha consulta HQL:

 public List<Material> consultaMaterialUnidadeHQL(String unidade) {
        Session session;
        if (em.getDelegate() instanceof EntityManagerImpl) {
            EntityManagerImpl entityManagerImpl = (EntityManagerImpl) em.getDelegate();
            session = entityManagerImpl.getSession();
        } else {
            session = (Session) em.getDelegate();
        }
        Criteria crit = session.createCriteria(Material.class);
//crit.createAlias("cliente", "cliente");

        String sql = "SELECT MATERIAL.TITULO as titulo,CLIENTE.CLIENTE as cliente,MATERIAL.DUARACAO as duracao,MATERIAL.XDCAM as xdcam,  \n"
                + "MATERIAL.DATAMATERIAL as dataMaterial,MATERIAL.STATUSOPEC as statusOPEC,MATERIAL.STATUSENG as statusEng, \n"
                + "MATERIAL.confirmaGravacaoProg as confirmaGravacaoProg \n"
                + "FROM MATERIAL \n"
                + "JOIN UNIDADE ON MATERIAL.ID_UNIDADEORIGEM = UNIDADE.ID_UNIDADE \n"
                + "JOIN CLIENTE ON MATERIAL.ID_CLIENTE = CLIENTE.ID_CLIENTE \n"
                + "WHERE UNIDADE.UNIDADE = :unidadeHQL \n"
                + "ORDER BY MATERIAL.DATAMATERIAL DESC";
        SQLQuery query = session.createSQLQuery(sql);
        query.addScalar("titulo", Hibernate.STRING);
        query.addScalar("cliente", Hibernate.STRING);
        query.addScalar("duracao", Hibernate.STRING);
        query.addScalar("xdcam", Hibernate.STRING);
        query.addScalar("dataMaterial", Hibernate.TIMESTAMP);
        query.addScalar("statusOPEC", Hibernate.STRING);
        query.addScalar("statusEng", Hibernate.STRING);
        query.addScalar("confirmaGravacaoProg", Hibernate.INTEGER);
        query.setParameter("unidadeHQL", unidade);
        query.setResultTransformer(Transformers.aliasToBean(Material.class));

        
        crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        
        
  List<Material> resultado = query.list();
 return resultado;     

}

Alguém poderia me ajudar os erros acima(nos post anteriores) não consigo resolver.

Descobri o erro, “selecionar” a coluna na tabela que possue um relacionamento, por exemplo:

SELECT A.NOME as aluno, S.NUMERO as sala, P.NOME as professor
FROM ALUNO A
JOIN SALA S ON A.ID_SALA = S.ID_SALA
JOIN PROFESSOR P ON S.ID_PROFESSOR = P.ID_PROFESSOR

logo apos eu dou um setter com .addScalar, para apontar qual coluna do selec corresponde:

query.addScalar("aluno", Hibernate.STRING);
        query.addScalar("sala", Hibernate.INTEGER);
        query.addScalar("professor", Hibernate.STRING);

e depois utilizo o AliasToBeanResultTransformer para pegar os alias de aluno:

query.setResultTransformer(new AliasToBeanResultTransformer(Equipamento.class));

porem é emitido esse erro:

org.hibernate.PropertyNotFoundException: Could not find setter for numero on class br.com.alex.siseng.entidade.Aluno

ou seja o setter numero se encontra na entidade sala não na entidade aluno, é curioso também entender que quando coloco uma condição(não importa qual das entidades ou tabelas) não da erro, somente na linha do select que da.
alguém ideia de como faço aliais no HQL? lembrando que estou usando o banco de dados Oracle.
Irei mudar o assunto to tópico.

Cara…o que tem que ser feito é como mapear dois alias de classes distintas no setResultTransformer…

no seu select tem o retorno de duas classes…sendo que vc passa apenas uma classe no aliasToBean…

estou tendo esse problema também, estou pesquisando sobre…

[quote=alextr]Quero transferir essa consulta:

public List<Material> consultaMaterialUnidade(String unidade) {
        Session session;
        if (em.getDelegate() instanceof EntityManagerImpl) {
            EntityManagerImpl entityManagerImpl = (EntityManagerImpl) em.getDelegate();
            session = entityManagerImpl.getSession();
        } else {
            session = (Session) em.getDelegate();
        }
        Criteria crit = session.createCriteria(Material.class);
        crit.createAlias("unidade", "u");
        crit.add(Restrictions.eq("u.unidade", unidade));
        crit.addOrder(Order.desc("dataMaterial"));
        crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        return crit.list();
    }

para HQL, minha entidade material:

private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "material_seq")
    @Column(name = "id")
    private Long id;
    @Column(name = "titulo")
    private String titulo;
    @Column(name = "loudness")
    private String loudness;
    @Column(name = "codMaterial")
    private String codMaterial;
    @Column(name = "ancine")
    private String ancine;
    @Column(name = "duaracao")
    private String duracao;
    @Column(name = "clip")
    private String clip;
    @Column(name = "geradora")
    private String geradora;
    @Column(name = "dataMaterial", updatable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date dataMaterial;
    @Column(name = "dataVencimento", updatable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date dataVencimento;
    @Column(name = "numeroMidia")
    private String numeroMidia;
    @Column(name = "statusENG")
    private String statusEng;
    @Column(name = "statusOPEC")
    private String statusOPEC;
    @Column(name = "grauDeteoriza")
    private String grauDeteoriza;
    @Column(name = "incidencia")
    private String incidencia;
    @Column(name = "gerado")
    private Boolean gerado = false;
    @Column(name = "geradoRessalva")
    private Boolean geradoRessalva;
    @Column(name = "recebido")
    private Boolean recebido;
    @Column(name = "observacaoOpe")
    private String observacaoOpe;
    @Column(name = "observacaoEng")
    private String observacaoEng;
    @Column(name = "observacaoCli")
    private String observacaoCli;
    @Column(name = "observacaoOpeRep")
    private String observacaoOpeRep;
    @Column(name = "Autorizacao")
    private String autorizacao;
    @Column(name = "pendencia")
    private String pendencia;
    @Column(name = "juPendencia")
    private Boolean juPendencia = false;
    private String observaocaoReprova;
    private Boolean confirmaGravacaoProg = false;
    private Boolean cancelaGravacaoProg = false;
    private String observacaoCancelaGravacaoProg;
    private Boolean solicitaGravacao = false;
    private String xdcam;
    private Boolean mantemMaterialDisco = false;
    //@ManyToOne----------------------------------------------------------------
    @ManyToOne
    @JoinColumn(name = "id_pendencia")
    private Usuario usuPendencia;
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "id_produtora")
    private Produtora produtora;
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "id_cliente")
    private Cliente cliente;
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "id_unidadeorigem")
    private Unidade unidade;
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "id_midia")
    private Midia midia;
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "id_OperadorEng")
    private Usuario operadorEng;
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "id_operador")
    private Usuario operador;
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "id_discomaterial")
    private DiscoMaterial discoMaterial;
    //--------------------------------------------------------------------------
    //@OneToMany ---------------------------------------------------------------  
    @OneToMany(mappedBy = "material", fetch = FetchType.LAZY, cascade = CascadeType.ALL, targetEntity = Geracao.class)
    private List<Geracao> geracoes;
    //--------------------------------------------------------------------------
    //@OneToOne-----------------------------------------------------------------
    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL, targetEntity = IrregularidadeComercial.class)
    private IrregularidadeComercial irregularidadeComercial;

e minha entidade cliente é:

 @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "cliente_seq")
    @Column(name = "id_cliente")
    private Long id;
    @Column(name = "cliente")
    private String cliente;
    @Column(name = "telefone")
    private String telefone;
    @Column(name = "contato")
    private String contato;
    @OneToMany(mappedBy = "cliente", cascade = CascadeType.ALL, fetch = FetchType.LAZY, targetEntity = Material.class)
    private List<Material> materials;

e até agora eu estou nesse ponto com minha consulta HQL:

 public List<Material> consultaMaterialUnidadeHQL(String unidade) {
        Session session;
        if (em.getDelegate() instanceof EntityManagerImpl) {
            EntityManagerImpl entityManagerImpl = (EntityManagerImpl) em.getDelegate();
            session = entityManagerImpl.getSession();
        } else {
            session = (Session) em.getDelegate();
        }
        Criteria crit = session.createCriteria(Material.class);
//crit.createAlias("cliente", "cliente");

        String sql = "SELECT MATERIAL.TITULO as titulo,CLIENTE.CLIENTE as cliente,MATERIAL.DUARACAO as duracao,MATERIAL.XDCAM as xdcam,  \n"
                + "MATERIAL.DATAMATERIAL as dataMaterial,MATERIAL.STATUSOPEC as statusOPEC,MATERIAL.STATUSENG as statusEng, \n"
                + "MATERIAL.confirmaGravacaoProg as confirmaGravacaoProg \n"
                + "FROM MATERIAL \n"
                + "JOIN UNIDADE ON MATERIAL.ID_UNIDADEORIGEM = UNIDADE.ID_UNIDADE \n"
                + "JOIN CLIENTE ON MATERIAL.ID_CLIENTE = CLIENTE.ID_CLIENTE \n"
                + "WHERE UNIDADE.UNIDADE = :unidadeHQL \n"
                + "ORDER BY MATERIAL.DATAMATERIAL DESC";
        SQLQuery query = session.createSQLQuery(sql);
        query.addScalar("titulo", Hibernate.STRING);
        query.addScalar("cliente", Hibernate.STRING);
        query.addScalar("duracao", Hibernate.STRING);
        query.addScalar("xdcam", Hibernate.STRING);
        query.addScalar("dataMaterial", Hibernate.TIMESTAMP);
        query.addScalar("statusOPEC", Hibernate.STRING);
        query.addScalar("statusEng", Hibernate.STRING);
        query.addScalar("confirmaGravacaoProg", Hibernate.INTEGER);
        query.setParameter("unidadeHQL", unidade);
        query.setResultTransformer(Transformers.aliasToBean(Material.class));

        
        crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        
        
  List<Material> resultado = query.list();
 return resultado;     

}

Alguém poderia me ajudar os erros acima(nos post anteriores) não consigo resolver.
[/quote]

Cara, além do fato que coloquei aqui na resposta anterior, você tem que colocar o as entre " " e o nome tem que ser igual ao atributo da classe…

o erro que aconteceu é que como não colocou entre " " o hibernate vai procurar o getTITULO e não getTitulo…

o restante está ok…

String sql = "SELECT MATERIAL.TITULO as \"titulo\""
                + ", c.CLIENTE as \"cliente\""
                + ", m.DUARACAO as \"duracao\""
                + ", m.XDCAM as \"xdcam\""
                + ", m.DATAMATERIAL as \"dataMaterial\""
                + ", m.STATUSOPEC as \"statusOPEC\""
                + ", m.STATUSENG as \"statusEng\""
                + ", m.confirmaGravacaoProg as \"confirmaGravacaoProg\""
                + " FROM MATERIAL m"
                + " JOIN UNIDADE u ON m.ID_UNIDADEORIGEM = u.ID_UNIDADE"
                + " JOIN CLIENTE c ON m.ID_CLIENTE = c.ID_CLIENTE"
                + " WHERE UNIDADE.UNIDADE = :unidadeHQL"
                + " ORDER BY MATERIAL.DATAMATERIAL DESC";

        SQLQuery query = session.createSQLQuery(sql);  
        query.addScalar("titulo", Hibernate.STRING);  
        query.addScalar("cliente", Hibernate.STRING);  
        query.addScalar("duracao", Hibernate.STRING);  
        query.addScalar("xdcam", Hibernate.STRING);  
        query.addScalar("dataMaterial", Hibernate.TIMESTAMP);  
        query.addScalar("statusOPEC", Hibernate.STRING);  
        query.addScalar("statusEng", Hibernate.STRING);  
        query.addScalar("confirmaGravacaoProg", Hibernate.INTEGER);  
        query.setParameter("unidadeHQL", unidade);  
        query.setResultTransformer(Transformers.aliasToBean(Material.class));