4
respostas

Hibernate: erro na consulta em HQL

Olá, estou tentando fazer uma consulta em hql em que uma entidade acessa o atributo (que é uma composição) da outra entidade pela consulta, mas retorna esse erro: java.lang.IllegalArgumentException: org.hibernate.QueryException: illegal attempt to dereference collection

Segue o código da consulta :

String hql = " from StringRange b" +
                        " where b.stringInicial <= :stringInicial " +
                        " and b.stringFinal >= :stringFinal" +
                        " and b.produtoInicial <= :produtoInicial" +
                        " and b.produtoFinal >= :produtoFinal" +
                        " and b.complementoInicial <= :complementoInicial" +
                        " and b.complementoFinal >= :complementoFinal " +
                        " and b.tipoTransacoes.mtiCodproc like :mtiCodproc";


                Object o = db.session().createQuery().
                        setParameter("stringInicial", getStringInicial(pan)).
                        setParameter("stringFinal", getStringFinal(pan)).
                        setParameter("produtoInicial", getProdutoInicial(pan)).
                        setParameter("produtoFinal", getProdutoFinal(pan)).
                        setParameter("complementoInicial", getComplementoInicial(pan)).
                        setParameter("complementoFinal", getComplementoFinal(pan)).
                        setParameter("mtiCodproc", "%"+txnType+"%").
                        list().get(0);

Obs: Não quero fazer a consulta com o join pois ele retorna dois objetos, e eu só quero um.

Alguém pode me ajudar?

4 respostas

Olá Maryana,

Acredito que o join será necessário, mas você pode utilizar o distinct para evitar a duplicidade. Se isso não resolver por favor, adicione a sua pergunta o código fonte da classe StringRange para termos uma ideia melhor de como está seu objeto.

Olá,

Não é que vem com duplicidade, é que vem o objeto da classe StringRange e o da classe TipoTransacao, mas eu queria que chegasse tudo em um objeto só, ai eu acho que não funcionaria com o distinct.

Segue o código da classe StringRange e o da TipoTransacao:

public class StringRange extends implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="ID_STRING_RANGE")
    private long idStringRange;

    @Column(name="STRING_FINAL")
    private String stringFinal;

    @Column(name="STRING_INICIAL")
    private String stringInicial;

    @Column(name="COMPLEMENTO_FINAL")
    private String complementoFinal;

    @Column(name="COMPLEMENTO_INICIAL")
    private String complementoInicial;

    @Column(name="PRODUTO_FINAL")
    private String produtoFinal;

    @Column(name="PRODUTO_INICIAL")
    private String produtoInicial;

    @ManyToMany (fetch = FetchType.EAGER)
    @JoinTable(name="STRING_RANGE_TIPO_TRANSACAO",joinColumns= {@JoinColumn(name="ID_STRING_RANGE")},
            inverseJoinColumns=@JoinColumn(name="ID_TIPO_TRANSACAO"))
    private List<TipoTransacao> tipoTransacoes;

    //Getters and Setters.
    }


public class TipoTransacao implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="ID_TIPO_TRANSACAO")
    private long idTipoTransacao;

    private String descricao;

    @Column(name="MTI_CODPROC")
    private String mtiCodproc;

    //Getters and Setters.
    }

Olá Maryana,

Só para verificar se eu entendi direito, se você fizer a query com o join conforme abaixo ele está retornando 2 objetos StringRange iguais (com o mesmo ID) porém cada um com um Tipo de Transação diferente?

String hql = " from StringRange b join fetch b.tipoTransacoes " +
                        " where b.stringInicial <= :stringInicial " +
                        " and b.stringFinal >= :stringFinal" +
                        " and b.produtoInicial <= :produtoInicial" +
                        " and b.produtoFinal >= :produtoFinal" +
                        " and b.complementoInicial <= :complementoInicial" +
                        " and b.complementoFinal >= :complementoFinal " +
                        " and b.tipoTransacoes.mtiCodproc like :mtiCodproc";

Não, ele retorna um objeto do StringRange e outro objeto do TipoTransacao, mas eu queria que retornasse tudo em um objeto só.

Segue a query com o join

String hql = " from StringRange b join b.tipoTransacoes t " +
                        " where b.stringInicial <= :stringInicial " +
                        " and b.stringFinal >= :stringFinal" +
                        " and b.produtoInicial <= :produtoInicial" +
                        " and b.produtoFinal >= :produtoFinal" +
                        " and b.complementoInicial <= :complementoInicial" +
                        " and b.complementoFinal >= :complementoFinal " +
                        " and t.mtiCodproc like :mtiCodproc";