Você sabe de qualquer maneira para obter um conjunto de resultados distintos sem usar o ResultTransformer ao usar setFirstResult e setMaxResults?
-
23-08-2019 - |
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
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