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]
[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”);
[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>
<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>
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
: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.
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”???
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.