JPA2 tem como fazer criteria através de Example ? como no hiberante?

Alguem sabe como fazer criteria no JPA2 igual existe o Example.create(target) do hibernate ?

Olá

Se você estiver usando o Hibernate como provider no seu JPA, é possível de fazer as queries for example

[quote=Leozin]Olá

Se você estiver usando o Hibernate como provider no seu JPA, é possível de fazer as queries for example[/quote]

isso eu sei…

a duvida é se a implementação de Criterias nova, que foi desenvolvida no JPA 2 (ou seja, criterias que valem tanto pro hiberante como o eclipselink) se existe algum equivalente ao Example.create(target) do hiberante…

todo o resto de criteira que precisei eu consegui fazer, falta só essa parte de example, que não sei se o JPA 2 implementou

Laviery, lí bem a spec do jpa2 e não tem nada sobre isso. O JEE6 tutorial é muito extenso, e não deu tempo de ler todo o tutorial + spec. Mas creio que não tenha find-by-example.

A API do JPA2 é muito complexa diante da criteria do Hibernate3. Como sempre quis usar JPA e não tinha criteria nele fiz uma API de criteria baseada nas classes do Hibernate para JPA. Na verdade tudo que eu fiz são um monte de classes de Criteria e Restrictions que no final o .toString dela gerava um HQL completo, assim bastava eu usar o createQuery do JPA normal.

Nessa implementação eu tinha feito um find-by-example que por baixo usava minha criteria, e ficou muito bom.

Tentei migrar isso para JPA2 mas não consegui ainda (por falta de tempo). Se você quiser posso te enviar esses códigos e você pode tentar algo. A idéia básica do meu find-by-example era navegar via Mirror (DSL de reflection usada no vraptor) para buscar as propriedades não nulas e fui criando os criterias baseados nisso. No final bastava mandar o JPA executar esse criteria.

Abraços

[quote=garcia-jj]Laviery, lí bem a spec do jpa2 e não tem nada sobre isso. O JEE6 tutorial é muito extenso, e não deu tempo de ler todo o tutorial + spec. Mas creio que não tenha find-by-example.

A API do JPA2 é muito complexa diante da criteria do Hibernate3. Como sempre quis usar JPA e não tinha criteria nele fiz uma API de criteria baseada nas classes do Hibernate para JPA. Na verdade tudo que eu fiz são um monte de classes de Criteria e Restrictions que no final o .toString dela gerava um HQL completo, assim bastava eu usar o createQuery do JPA normal.

Nessa implementação eu tinha feito um find-by-example que por baixo usava minha criteria, e ficou muito bom.

Tentei migrar isso para JPA2 mas não consegui ainda (por falta de tempo). Se você quiser posso te enviar esses códigos e você pode tentar algo. A idéia básica do meu find-by-example era navegar via Mirror (DSL de reflection usada no vraptor) para buscar as propriedades não nulas e fui criando os criterias baseados nisso. No final bastava mandar o JPA executar esse criteria.

Abraços[/quote]

tem que analizar bem… o JPA 2 tem o meta modelo estatico que é muito interessante e eu estou gostando bastante… da pra fazer tipagem forte, o que é muito bom…

EU iniciei fazendo um pacote de criteria tb, mas deichei de lado, pq o do Hibernate é bem fácil de usar, e eu queria fazer com tipagem forte… agora com JPA2 e a geração de metamodelos staticos da pra conseguir fazer o criteira…

o ByExample é o mais complexo, vc tem q saber se as anotações estão nas propriedades ou nos campos, verificar sempre se o campo é ou não transient, fazer N checagens … além de que transformar em HQL não acho muito legal.

Você pode fazer algo bem interessante usando o modelo estático. Você pode, por exemplo, via mirror fazer um describe no objeto e verificar as propriedades não nulas e a partir delas pegar o modelo estático e construir o criteria.

Essa minha idéia de fazer meu próprio criteria era nos tempo do JPA1. Embora a criteria do JPA2 seja bem complexa não vejo porque não usar o padrão, né? Então para os projetos que posso usar JPA2 estou já usando o modelo novo. Para os que não posso usar JPA2 seguem com minha criteria.

O que eu fiz na minha foi varrer o objeto e verificar as propriedades. Se continer @Transient ou modificadores static ou transient a propriedade é ignorada. Caso for um @Entity ou @Embeded ele navega dentro do objeto.

Transformar em JPQL é um nojo mesmo, mas era a única coisa que eu poderia fazer no JPA1. Esse foi o preço que eu paguei por querer usar JPA e não Hibernate. Além do mais como o projeto é EJB seria um saco ficar fazendo manual entityManager.getDelegate.

Abraços