Você sabe de qualquer maneira para obter um conjunto de resultados distintos sem usar o ResultTransformer ao usar setFirstResult e setMaxResults?

StackOverflow https://stackoverflow.com/questions/545940

Pergunta

Quando eu uso setFirstResult e setMaxResult e se a consulta tem se junta o resultado tem resultados duplicados em vez de único.

Então eu uso todos os tipos de ajudantes distintos para critérios api. Mas ele não filtrar todo o conjunto de resultados apenas filtra o resultado paginada.

Como posso superar esse problema?

Graças

Foi útil?

Solução

Eu encontrei um coisa hacky para superar esta questão.

A única "solução" para este que Eu tenho sido capaz de chegar a é emitir duas consultas de critérios mesmos critérios objeto. O primeiro recebe do id o segundo é contrained para os ids.

// configurar crtieria como você deseja, incluindo a paginação myCriteria = doStuffToSetupCriteria (); myCriteria.setFirstResult ((página-1) * itemsPerPage); myCriteria.setMaxResults (itemsPerPage);

// obter a lista se as chaves primárias myCriteria.setProjection (Projections.distinct (Projections.property ( "myAllias.id")); ids list = gacc.list ();

// agora adicionar os do id para o restrição myCriteria.add (Restrictions.in ( "myAlias.id, ids));

// limpeza na última corrida critiera gacc.setProjection (nulo); gacc.setFirstResult (0); gacc.setMaxResults (Integer.MAX_VALUE);

// seus resultados Lista objetos = gacc.list ()

Um pouco hacky Concordo, mas a única Soltion aceitável que eu poderia encontrar um determinado este limitiation.

Outras dicas

Eu construí uma solução semelhante, mas em apenas uma viagem a DB:

DetachedCriteria subconsulta = ... // -> Adicionar todos os Critérios que você quer e "setFirstResult" inclusiva e "setMaxResults"

= DetachedCriteria rootQuery DetachedCriteria.For (); // onde T é uma entidade

subQuery.SetProjection ( Projections.Distinct ( Projections.ProjectionList (). Adicionar (Projections.Alias ??(Projections.Property ( "ID"), "ID")) ) );

// Nota: todas as minhas entidades herdar de uma classe base que contém uma propriedade "ID" rootQuery.Add (Subqueries.PropertyIn ( "ID", subconsulta));

// ... então usar rootQuery para obter a lista de T e item não repetiu serão recuperados.

Espero que alguém encontrar este útil implementação:)

Román

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