Hibernate (Alias) [Resolvido]


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?

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?

É 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

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

Pode fazer na criteria original

Hmm… legal… vou implementar.

Vlw.

[quote=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[/quote]

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.

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)

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:

Agora to em casa, segunda eu tento, valeu!

Era isso mesmo valeu.

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?

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?

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());