Hibernate (Alias) [Resolvido]

13 respostas
Marky.Vasconcelos


Duvida no ultimo post

O caso é.

Tenho uma classe chamada Cotacao que tem um atributo Empresa que tem um atributo String.

Eu gostaria de fazer um select de Cotacao usando um where da String da Empresa.

É possivel fazer isso?

Mas usando a Criteria?

13 Respostas

Marky.Vasconcelos

Pensei em algo sobre isso…

Posso fazer um where da String pra empresa e das empresas para Cotacao. Mas eu consigo fazer um select com uma lista como where e o hibernate coloque tudo como OR?

Imaginei o seguinte

List<Empresa> list = s.createCriteria(Empresa.class).add(Restrictions.like("razaoSocial",filterText,MatchMode.ANYWHERE));

List<Cotacao> listC = s.createCriteria(Cotacao.class).add(Restrictions.//Aqui nao existe uma Restriction para receber uma lista e ter um or pra cada elemento?
Jair_Rillo_Junior

É possível sim :lol:

Crie um alias (usando o addAlias) e a partir dai, use o Restrictions nesse alias.
Supondo que dentro da classe Cotação, você tenha um atributo chamado empresas

Criteria c = getSession().createCriteria(Cotacao.class);
c.createAlias("empresas","empresa"); //aqui o alias é criado
c.add(Restrictions.eq("empresa.nome",seu_parametro_aqui);

Fiz o código acima direto, portanto pode ter erro de compilação, mas o grande segredo nesse cara é o alias.

Espero ter ajudado

Marky.Vasconcelos

Pelo que eu vi o método createAlias retorna outro Criteria. Eu preciso adicionar a Restricion a essa criteria ou na original mesmo?

Jair_Rillo_Junior

Pode fazer na criteria original

Marky.Vasconcelos

Hmm… legal… vou implementar.

Vlw.

Marky.Vasconcelos

Jair Rillo Junior:
É possível sim :lol:

Crie um alias (usando o addAlias) e a partir dai, use o Restrictions nesse alias.
Supondo que dentro da classe Cotação, você tenha um atributo chamado empresas

Criteria c = getSession().createCriteria(Cotacao.class);
c.createAlias("empresas","empresa"); //aqui o alias é criado
c.add(Restrictions.eq("empresa.nome",seu_parametro_aqui);

Fiz o código acima direto, portanto pode ter erro de compilação, mas o grande segredo nesse cara é o alias.

Espero ter ajudado

Estudando um pouco melhor seu código, acho que voce não entendeu minha duvida.

Realmente Cotação só tem uma Empresa. Mas varias Cotações podem ter a mesma empresa. O que quero é através do nome da empresa pegar todas as Empresas que contenham em seu nome esse trecho. E pegar todas as cotações que tenham qualquer uma dessas empresas.

EDIT:

Esqueçe… Resolvido

Muito obrigado.

Marky.Vasconcelos

Resucitando o tópico por que agora o problema vai um pouco mais longe.
Tenho uma classe Conhecimento que tem uma Cotacao que tem a Empresa.
Quero pesquisar todos Conhecimentos que tem uma Cotação que respeite o where na razaoSocial da empresa.
Tentei o seguinte:

Session s = HibernateUtil.openSession();
		Criteria crit = s.createCriteria(Conhecimento.class);
		crit.createAlias("cotacao", "cotacao");
		crit.createAlias("cotacao.remetente", "remetente");
		crit.add(Restrictions.like("cotacao.remetente.razaoSocial", "vilheto%",
				MatchMode.ANYWHERE));
		System.out.println(crit.list().size());

E a seguinte StackTrace é lançada.

[Exception in thread "main" org.hibernate.QueryException: could not resolve property: cotacao.remetente.razaoSocial of: br.com.sistram.model.conhecimento.Conhecimento
	at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:44)
	at org.hibernate.persister.entity.AbstractPropertyMapping.toColumns(AbstractPropertyMapping.java:59)
	at org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns(BasicEntityPropertyMapping.java:31)
	at org.hibernate.persister.entity.AbstractEntityPersister.toColumns(AbstractEntityPersister.java:1354)
	at org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumns(CriteriaQueryTranslator.java:434)
	at org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumnsUsingProjection(CriteriaQueryTranslator.java:394)
	at org.hibernate.criterion.SimpleExpression.toSqlString(SimpleExpression.java:45)
	at org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:334)
	at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:90)
	at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:59)
	at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:67)
	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1550)
	at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
	at br.com.sistram.util.DaoListPaginator.main(DaoListPaginator.java:159)
von.juliano

O erro está na Restriction. Se você criou o alias, não precisa usar o “caminho completo”:

crit.createAlias("cotacao", "cotacao"); crit.createAlias("cotacao.remetente", "remetente"); crit.add(Restrictions.like("remetente.razaoSocial", "vilheto%", MatchMode.ANYWHERE)); // só com remetente ele vai encontrar a propriedadeTesta e vê se resolve! Flw! :thumbup:

Marky.Vasconcelos

Agora to em casa, segunda eu tento, valeu!

Marky.Vasconcelos

Era isso mesmo valeu.

Marky.Vasconcelos

Novamente…

Eu reparei que quando faço o alias em atributos @Embedded ele da erro.

Exemplo:

Classe Motorista tem @Embedded Contato
Classe Contato tem atributo nome.

Mas o seguinte código:

Session s = HibernateUtil.openSession();
		Criteria crit = s.createCriteria(Motorista.class);
		crit.createAlias("contato", "contato");
		crit.add(Restrictions.like("contato.nome", "jo",
				MatchMode.ANYWHERE));
		System.out.println(crit.list().size());

Resulta em:

Exception in thread "main" org.hibernate.QueryException: could not resolve property: nome of: br.com.sistram.model.prestador.Motorista
	at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:44)
	at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:38)
	at org.hibernate.persister.entity.AbstractEntityPersister.getSubclassPropertyTableNumber(AbstractEntityPersister.java:1379)
	at org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns(BasicEntityPropertyMapping.java:31)
	at org.hibernate.persister.entity.AbstractEntityPersister.toColumns(AbstractEntityPersister.java:1354)
	at org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumns(CriteriaQueryTranslator.java:434)
	at org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumnsUsingProjection(CriteriaQueryTranslator.java:394)
	at org.hibernate.criterion.SimpleExpression.toSqlString(SimpleExpression.java:45)
	at org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:334)
	at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:90)
	at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:59)
	at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:67)
	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1550)
	at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
	at br.com.sistram.util.DaoListPaginator.main(DaoListPaginator.java:160)

Engraçado que o código a seguir faz exatamente o mesmo erro.

Session s = HibernateUtil.openSession();
		Criteria crit = s.createCriteria(Motorista.class);
		crit.add(Restrictions.like("nome", "jo",
				MatchMode.ANYWHERE));
		System.out.println(crit.list().size());

Alguma ajuda?

Marky.Vasconcelos

Bem… dando re-up por que estou sem solução.

Mas percebi que se eu tiro o atributo de Embedded e mapeio com OneToOne o alias funciona perfeitamente.

Alguma sugestão?

Marky.Vasconcelos

Assim funciona.

Session s = HibernateUtil.openSession();
Criteria crit = s.createCriteria(Motorista.class);
crit.add(Restrictions.like("contato.nome", "jo"));
System.out.println(crit.list().size());
Criado 14 de maio de 2009
Ultima resposta 26 de nov. de 2009
Respostas 13
Participantes 3