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

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:

[code]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.

[/code]

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]

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_

[quote=“maxguzenski”]eu uso hibernate em aplicacoes pesadas e isso nao acontence.
nao esta Double no teu bean ? ou talves no xml ?[/quote]

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

é, 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”);

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

:?:

Estou com lazy=“true”. Descartei essa então.

tentando um

[code]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”[/code]
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[code]<?xml version="1.0"?>

    <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>

[/code]
Produto.hbm.xml[code]<?xml version="1.0"?>

    <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>

[/code]
RelLinhaProduto.hbm.xml[code]<?xml version="1.0"?>

    <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>

[/code]

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:

Talvez ajude.

: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.

Não esquece de postar o resultado :wink:

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”???

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

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.

blz

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