Hql e pgsql: "O nome da coluna não foi encontrado"

12 respostas
maresp
Estou utilizando o hibernate com postgresql. Ao executar este hql
select produto from br.com.atmtec.teste.Linha as linha inner join linha.produtos as produto where produto.id.produto.descricao like :param
obtive o seguinte erro:
11:19:36,265 DEBUG QueryParameters:109 - named parameters: {param=%video%}
11:19:36,312 DEBUG QueryTranslator:147 - compiling query
11:19:36,359 DEBUG QueryTranslator:199 - HQL: 
            select produto from br.com.atmtec.teste.Linha as linha inner join linha.produtos as produto where produto.id.produto.descricao like :param
        
11:19:36,359 DEBUG QueryTranslator:200 - SQL: select produtos1_.prd_id as x0_0_ from data.linha linha0_ inner join data.rel_linha_produto produtos1_ on linha0_.lin_id=produtos1_.lin_id, data.produtox produto2_ where (produto2_.prd_dc like ?  and produtos1_.prd_id=produto2_.prd_id)
11:19:36,375 DEBUG BatcherImpl:196 - about to open: 0 open PreparedStatements, 0 open ResultSets
11:19:36,375 DEBUG SQL:237 - select produtos1_.prd_id as x0_0_ from data.linha linha0_ inner join data.rel_linha_produto produtos1_ on linha0_.lin_id=produtos1_.lin_id, data.produtox produto2_ where (produto2_.prd_dc like ?  and produtos1_.prd_id=produto2_.prd_id)
11:19:36,375 DEBUG BatcherImpl:241 - preparing statement
11:19:36,375 DEBUG StringType:46 - binding '%video%' to parameter: 1
11:19:36,406 DEBUG Loader:197 - processing result set
11:19:36,406 DEBUG Loader:405 - result row: 
11:19:36,421 DEBUG DoubleType:68 - returning '43.0' as column: x0_0_
11:19:36,468 DEBUG JDBCExceptionReporter:36 - SQL Exception
org.postgresql.util.PSQLException: O nome da coluna x0_1_ não foi encontrado.
...

Alguém já teve esse problema com pgsql ou outro SGBD?

[editado] Esclarecendo um pouco, essa consulta está sendo feita em cima de uma relação many-to-many. A referência produto.id.produto.descricao é para minha tabela de relacionamento, 'id' é o objeto que representa a pk que contém o atributo 'produto'. Isso aqui tá errado... esse campo é um Long e não Double:
11:19:36,421 DEBUG DoubleType:68 - returning '43.0' as column: x0_0_
Se com uma consulta simples tá dando pau estou até imaginando o inferno que vou passar. Já procurei no JIRA por algum bug do tipo mas não encontrei nada. [/editado]

12 Respostas

maxguzenski

eu uso hibernate em aplicacoes pesadas e isso nao acontence.
nao esta Double no teu bean ? ou talves no xml ?

e outra coisa, esta acusando erro em x0_1_

org.postgresql.util.PSQLException: O nome da coluna x0_1_ não foi encontrado.

e nao em x0_0_

maresp

“maxguzenski”:
eu uso hibernate em aplicacoes pesadas e isso nao acontence.
nao esta Double no teu bean ? ou talves no xml ?

Não, nem no bean nem no xml…
Quanto a tradução do hql para o sql nativo o que deu para entender é que ele retorna o id do objeto para depois fazer load com esse id. Se for isso, ele tá tentando retornar um valor para uma coluna (x0_1_ - alias) que não existe, o que existe é x0_0_, e aí quem lança o erro é o banco. Será que pode ser algo com o driver? Segue minhas versões:
postgresql v. 7.4.3
driver: pg74.214.jdbc3.jar

maxguzenski

é, com postgree eu realmente nao sei… mas te
garanto, que se nao é erro de configuracao
em SQLServer, Oracle e ate mysql essa consulta funciona perfeitamente…

1)ta usando hibernate 2.x ? ou 3 ?
2) ja tentou executar essa queri no banco? para ver se ela funciona ?

uma dica, teu “produto” tambem exerga linha? se sim, so faz:
from Produto as prod where prod.id…

pq o hibernate por padrao levanta todos os relacionamentos com produto, a menos q tu tenha colocado “lazy=true” no teu xml

mas se tu tiver lazy=true ou minha 1º fica na funcionar, faz assim:
select element(linha.produto) from linha as linha

e depois:
session.filter(collectionRetornada, “where this.id.produto.descricao like :param”);

maresp

1) Hibernate 2.x
2) Já. Excecutou sem problemas.

"maxguzenski":
uma dica, teu "produto" tambem exerga linha? se sim, so faz: from Produto as prod where prod.id....
:?:

Estou com lazy="true". Descartei essa então.

tentando um
select elements(linha.produto) from br.com.atmtec.teste.Linha as linha

... e depois com o List fazendo um session.filter

session.filter(produtos, "where this.id.produto.descricao like :param"
obtive isto aqui:
15:13:01,796 ERROR ServletDispatcher:278 - Could not execute action
net.sf.hibernate.PropertyAccessException: exception setting property value with CGLIB (set hibernate.cglib.use_reflection_optimizer=false for more info) setter of br.com.atmtec.teste.LinhaProdutoPk.setProduto
	at net.sf.hibernate.type.ComponentType.setPropertyValues(ComponentType.java:219)
	at net.sf.hibernate.type.ComponentType.resolveIdentifier(ComponentType.java:406)
...
dá uma olhada nos mapeamentos das classes Linha e Produto: Linha.hbm.xml
<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 2.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>
    <class
        name="br.com.atmtec.teste.Linha"
        table="linha"
        dynamic-update="false"
        dynamic-insert="false"
    >

        <id
            name="id"
            column="lin_id"
            type="java.lang.Long"
            unsaved-value="null"
        >
            <generator class="hilo">
                <param name="table">data.pk_value</param>
                <param name="column">pk_linha</param>
                <param name="max_lo">1</param>
            </generator>
        </id>

        <property
            name="descricao"
            type="java.lang.String"
            update="true"
            insert="true"
            access="property"
            column="lin_dc"
        />

        <property
            name="comissao"
            type="java.lang.Double"
            update="true"
            insert="true"
            access="property"
            column="lin_cmss"
        />

        <many-to-one
            name="pai"
            class="br.com.atmtec.teste.Linha"
            cascade="all"
            outer-join="auto"
            update="true"
            insert="true"
            access="property"
            column="lin_pai"
        />

		<set
            name="produtos"
            lazy="false"
            inverse="false"
            cascade="none"
            sort="unsorted"
			table="rel_linha_produto"
        >

              <key
                  column="lin_id"
              >
              </key>

              <composite-element class="br.com.atmtec.teste.RelLinhaProduto">
		        <property
        		    name="comissao"
		            type="double"
		            update="true"
		            insert="true"
		            access="property"
		            column="rel_lp_cmss"
		        />
				<nested-composite-element 
					class="br.com.atmtec.teste.LinhaProdutoPk" 
					name="id"
				>
					<many-to-one 
			            name="produto"
			            class="br.com.atmtec.teste.Produto"
			            cascade="none"
			            outer-join="auto"
			            update="true"
			            insert="true"
			            access="property"
			            column="prd_id"
			        />
				</nested-composite-element>
			</composite-element>
        </set>

        <property
            name="leaf"
            type="boolean"
            update="true"
            insert="true"
            access="property"
            column="lin_isleaf"
        />

        <!--
            To add non XDoclet property mappings, create a file named
                hibernate-properties-Linha.xml
            containing the additional properties and place it in your merge dir.
        -->

    </class>

        <query name="linha.list.all"><![CDATA[
            from br.com.atmtec.teste.Linha
        ]]></query>
        <query name="list.by.pai"><![CDATA[
            from br.com.atmtec.teste.Linha linha where linha.pai = :pai
        ]]></query>
        <query name="list.where.pai.isnull"><![CDATA[
            from br.com.atmtec.teste.Linha linha where linha.pai is null
        ]]></query>

</hibernate-mapping>
Produto.hbm.xml
<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 2.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>
    <class
        name="br.com.atmtec.teste.Produto"
        table="produtox"
        dynamic-update="false"
        dynamic-insert="false"
    >

        <id
            name="id"
            column="prd_id"
            type="java.lang.Long"
            unsaved-value="null"
        >
            <generator class="hilo">
                <param name="table">data.pk_value</param>
                <param name="column">pk_produtox</param>
                <param name="max_lo">1</param>
            </generator>
        </id>

        <property
            name="descricao"
            type="java.lang.String"
            update="true"
            insert="true"
            access="property"
            column="prd_dc"
        />

		<set
            name="linhas"
            lazy="false"
            inverse="true"
            cascade="none"
            sort="unsorted"
			table="rel_linha_produto"
        >

              <key
                  column="prd_id"
              >
              </key>

              <composite-element class="br.com.atmtec.teste.RelLinhaProduto">
		        <property
        		    name="comissao"
		            type="double"
		            update="true"
		            insert="true"
		            access="property"
		            column="rel_lp_cmss"
		        />
				<nested-composite-element 
					class="br.com.atmtec.teste.LinhaProdutoPk" 
					name="id"
				>
					<many-to-one 
			            name="produto"
			            class="br.com.atmtec.teste.Linha"
			            cascade="none"
			            outer-join="auto"
			            update="true"
			            insert="true"
			            access="property"
			            column="lin_id"
			        />
				</nested-composite-element>
			</composite-element>
        </set>

        <!--
            To add non XDoclet property mappings, create a file named
                hibernate-properties-Produto.xml
            containing the additional properties and place it in your merge dir.
        -->

    </class>

        <query name="find.like.descricao"><![CDATA[
            from br.com.atmtec.teste.Produto p where upper(p.descricao) like :part
        ]]></query>
        <query name="find.like.descricao.join.linha"><![CDATA[
            from br.com.atmtec.teste.Produto produto right join produto.linhas as linhas where linhas.id.produto.descricao like :param
        ]]></query>
        <query name="select.produto.from.linha"><![CDATA[
            select elements(linha.produtos) from br.com.atmtec.teste.Linha as linha
        ]]></query>

</hibernate-mapping>
RelLinhaProduto.hbm.xml
<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 2.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>
    <class
        name="br.com.atmtec.teste.RelLinhaProduto"
        table="rel_linha_produto"
        dynamic-update="false"
        dynamic-insert="false"
    >

        <composite-id
            name="id"
            class="br.com.atmtec.teste.LinhaProdutoPk"
        >
                     <key-property
                        name="linha"
                        type="br.com.atmtec.teste.Linha"
                        column="lin_id"
                />

                     <key-property
                        name="produto"
                        type="br.com.atmtec.teste.Produto"
                        column="prd_id"
                />

        </composite-id>

        <property
            name="comissao"
            type="double"
            update="true"
            insert="true"
            access="property"
            column="rel_lp_cmss"
        />

        <!--
            To add non XDoclet property mappings, create a file named
                hibernate-properties-RelLinhaProduto.xml
            containing the additional properties and place it in your merge dir.
        -->

    </class>

</hibernate-mapping>
maxguzenski

eh, olhei meio por cima, nao tenho como ver bem agora… mas tipo, tu tem lazy=false nos teus sets… isso quer dizer q ele vai carregar os relacionamentos tu querendo ou naol… entao, minha primeira dica deve funcionar…

outra coisa, conhece o Hibern8IDE ? ele vem no hibenrate_extras.
é uma IDE pra executar hql, la é barbada , tu pode ficar testando ate conseguir fazer o q voce quer :slight_smile:

_fs

Talvez ajude.

maresp

:oops: juro que achei que tinha alterado para true… é que estou gerando os hbm’s com XDoclet e utilizando um mergeDir para algumas tags sem suporte do XDoclet. Mesmo assim muito obrigado pela ajuda. Valeu a força também Lipe, vou mudar meu hibernate.cfg.xml.

_fs

Não esquece de postar o resultado :wink:

maresp

Cara não aguento mais… agora deu isso aqui…

net.sf.hibernate.QueryException: The collection was unreferenced net.sf.hibernate.impl.SessionImpl.getFilterTranslator(SessionImpl.java:3446)
o que ele quer dizer com “The colection was unreferenced”???

maxguzenski

talves eu tenha te dito errado como se faz um filter…
da um olhada na documentacao, procura por filter, tem bem explicado.

maresp

Consegui realizar minha query com o seguinte hql:

from br.com.atmtec.teste.Produto produto join produto.linhas as linhas where linhas.id.produto.descricao like :param

O problema estava no mapeamento da tabela de relacionamento. Como podem ver nos meus relacionamentos tenho uma classe que representa minha composite-id. Eu estava utilizando <key-property> invés de <key-many-to-one>. Percebí esse problema revisando os relacionamentos pq o hibernate não acusa nenhum erro enquanto ele está instanciando a SessionFactory.
Mas não consegui utilizar session.filter, sempre retorna o mesmo erro: “The collection was ureferenced”. Valeu a força Max e Lipe.

maxguzenski

blz

é que property é para campo normal, e many-to-one é para FKs
e o hibernate realmente nao valida isso… :smiley:

Criado 22 de outubro de 2004
Ultima resposta 25 de out. de 2004
Respostas 12
Participantes 3