Pergunta

Para ser breve: Hibernate não suporta projeções e consulta por exemplo? Eu encontrei este post:

O código é o seguinte:

User usr = new User();
usr.setCity = 'TEST';
getCurrentSession().createCriteria(User.class)
.setProjection( Projections.distinct( Projections.projectionList()
.add( Projections.property("name"), "name")
.add( Projections.property("city"), "city")))
.add( Example.create(usr))

Como a outro cartaz disse, o SQL gerado mantém ter uma onde refering classe para apenas y0_ =? em vez de this_.city .

Eu já tentei várias abordagens, e procurou o issue tracker, mas não encontrou nada sobre isso.

Eu até tentei uso de alias Projeção e Transformers, mas ele não funciona:

User usr = new User();
usr.setCity = 'TEST';
getCurrentSession().createCriteria(User.class)
.setProjection( Projections.distinct( Projections.projectionList()
.add( Projections.property("name"), "name")
.add( Projections.property("city"), "city")))
.add( Example.create(usr)).setResultTransformer(Transformers.aliasToBean(User.class));

Alguém já usou projeções e consulta por exemplo?

Foi útil?

Solução

Posso ver a sua classe de usuário? Esta é apenas usando restrições abaixo. Eu não vejo por Restrições seria muito diferente do que exemplos (acho campos nulos são ignoradas por padrão no exemplos embora).

getCurrentSession().createCriteria(User.class)
.setProjection( Projections.distinct( Projections.projectionList()
.add( Projections.property("name"), "name")
.add( Projections.property("city"), "city")))
.add( Restrictions.eq("city", "TEST")))
.setResultTransformer(Transformers.aliasToBean(User.class))
.list();

Eu nunca usei o alaistToBean, mas eu só li sobre isso. Você também pode apenas loop sobre os resultados ..

List<Object> rows = criteria.list();
for(Object r: rows){
  Object[] row = (Object[]) r;
  Type t = ((<Type>) row[0]);
}

Se você tem que você pode preencher manualmente Usuário-se dessa forma.

Seu tipo de difícil olhar para o problema sem mais algumas informações para diagnosticar o problema.

Outras dicas

O problema parece acontecer quando você tem um alias o mesmo nome que a propriedade objetos. Hibernate parece pegar o alias e usá-lo no sql. Achei isso documentado aqui e aqui , e eu acreditam que ele seja um bug no Hibernate, embora eu não estou certo de que a equipe Hibernate concorda.

De qualquer maneira, eu encontrei um trabalho simples em torno de que as obras no meu caso. Sua milhagem pode variar. Os detalhes estão abaixo, tentei simplificar o código para esta amostra por isso peço desculpas por quaisquer erros ou erro de digitação de:

Criteria criteria = session.createCriteria(MyClass.class)
    .setProjection(Projections.projectionList()
        .add(Projections.property("sectionHeader"), "sectionHeader")
        .add(Projections.property("subSectionHeader"), "subSectionHeader")
        .add(Projections.property("sectionNumber"), "sectionNumber"))
    .add(Restrictions.ilike("sectionHeader", sectionHeaderVar)) // <- Problem!
    .setResultTransformer(Transformers.aliasToBean(MyDTO.class));

Será que produzir este sql:

select
    this_.SECTION_HEADER as y1_,
    this_.SUB_SECTION_HEADER as y2_,
    this_.SECTION_NUMBER as y3_,
from
    MY_TABLE this_ 
where
    ( lower(y1_) like ? ) 

O que estava causando um erro: java.sql.SQLException: ORA-00904: "Y1_": inválido identificador

Mas, quando eu mudei de restrição ao uso "isto", assim:

Criteria criteria = session.createCriteria(MyClass.class)
    .setProjection(Projections.projectionList()
        .add(Projections.property("sectionHeader"), "sectionHeader")
        .add(Projections.property("subSectionHeader"), "subSectionHeader")
        .add(Projections.property("sectionNumber"), "sectionNumber"))
    .add(Restrictions.ilike("this.sectionHeader", sectionHeaderVar)) // <- Problem Solved!
    .setResultTransformer(Transformers.aliasToBean(MyDTO.class));

Ele produziu o seguinte sql e meu problema foi resolvido.

select
    this_.SECTION_HEADER as y1_,
    this_.SUB_SECTION_HEADER as y2_,
    this_.SECTION_NUMBER as y3_,
from
    MY_TABLE this_ 
where
    ( lower(this_.SECTION_HEADER) like ? ) 

Isso, isso! Um bastante simples correção para um problema doloroso. Eu não sei como essa correção se traduziria à consulta por exemplo problema, mas pode chegar mais perto.

O verdadeiro problema aqui é que há um bug em hibernação, onde ele usa select-list aliases na onde cláusula:

http://opensource.atlassian.com/projects/hibernate/browse/ HHH-817

Apenas no caso de alguém terras aqui à procura de respostas, ir olhar para o bilhete. Levou 5 anos para corrigir, mas, em teoria, estará em um dos próximos lançamentos e então eu suspeito que o problema vai embora.

Eu estou enfrentando um problema semelhante. Estou usando Query by Example e quero classificar os resultados por um campo personalizado. Em SQL eu faria algo como:

select pageNo, abs(pageNo - 434) as diff
from relA
where year = 2009
order by diff

Ele funciona muito bem sem a order-by-clause. O que eu tenho é

Criteria crit = getSession().createCriteria(Entity.class);
crit.add(exampleObject);
ProjectionList pl = Projections.projectionList();
pl.add( Projections.property("id") );
pl.add(Projections.sqlProjection("abs(`pageNo`-"+pageNo+") as diff", new String[] {"diff"}, types ));
crit.setProjection(pl);

Mas quando eu adiciono

crit.addOrder(Order.asc("diff"));

Eu recebo um org.hibernate.QueryException: não poderia propriedade resolve: diff exceção. Solução com este não quer trabalhar.

PS: como eu não poderia encontrar qualquer documentação elaborada sobre o uso de QBE para Hibernate, todo o material acima é principalmente abordagem e erro experimental

ProjectionList pl = Projections.projectionList();
pl.add(Projections.property("id"));
pl.add(Projections.sqlProjection("abs(`pageNo`-" + pageNo + ") as diff", new String[] {"diff"}, types ), diff); ---- solution
crit.addOrder(Order.asc("diff"));
crit.setProjection(pl);

Eu realmente não penso assim, o que eu posso encontrar é a palavra "isso". faz com que o Hibernate para não incluir quaisquer restrições em sua consulta, o que significa que tem todas as listas de registros. Sobre o bug de hibernação que foi relatado, eu posso ver que é relatada como fixo, mas eu totalmente não conseguiu baixar o Patch.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top