NHibernate Como selecionar objetos distintos com base na propriedade específica usando HQL?

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

  •  05-07-2019
  •  | 
  •  

Pergunta

Como pode HQL ser usado para selecionar específica objetos que atendem a determinados critérios?

Nós tentamos as seguintes para gerar uma lista de dez melhores subscrito feeds RSS (onde SubscriptionCount é uma propriedade derivada):

var topTen = UoW.Session.CreateQuery( @"SELECT distinct rss 
                                                 FROM RssFeedSubscription rss
                                                 group by rss.FeedUrl
                                                 order by rss.SubscriptionCount DESC
                                                 ")
.SetMaxResults(10)
.List<RssFeedSubscription>();

Quando a intenção é apenas para selecionar os dois URLs de feed exclusivo no banco de dados, em vez das linhas dez int o banco de dados instanciado como objetos. O resultado do acima é:

Column 'RssSubscriptions.Id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
ORDER BY items must appear in the select list if SELECT DISTINCT is specified.

É possível apenas para diluir os resultados para que tirar os dois URLs de feed exclusivo depois de receber a parte de trás de dados do banco de dados, mas deve haver uma maneira de fazer isso no nível de DB usando HQL?

EDIT:? Nós sabemos que é possível fazer uma consulta escalar e, em seguida, manualmente retirar valores, mas não há uma maneira de simplesmente especificando um critério de jogo de objetos puxado para trás

Foi útil?

Solução

Se você mudar de HQL um pouco para olhar assim:

var topTen = UoW.Session.CreateQuery( @"SELECT distinct rss.FeedUrl
                                          FROM RssFeedSubscription rss
                                          group by rss.FeedUrl
                                          order by rss.SubscriptionCount DESC
                                        ")
.SetMaxResults(10)
.List();

a variável TOPTEN será um objecto [] com 2 elementos em que haja os URLs de alimentação 2.

Você pode ter este retornado como coleção fortemente tipada se você usar o método SetResultTransformer () do IQuery interfase.

Outras dicas

Você precisa executar uma consulta escalar. Aqui está um exemplo de docs NHibernate:

IEnumerable results = sess.Enumerable(
    "select cat.Color, min(cat.Birthdate), count(cat) from Cat cat " +
    "group by cat.Color"
);
foreach ( object[] row in results )
{
    Color type = (Color) row[0];
    DateTime oldest = (DateTime) row[1];
    int count = (int) row[2];
    .....
}

É o group by rss.FeedUrl que está causando o problema. Ele não se parece com você precisar dele desde que você está selecionando as próprias entidades. Retire isso e eu acho que você vai ser bom.

Editar - Minhas desculpas Eu não percebi a parte sobre a "propriedade derivada". Por isso, quero assumir que significa que não é uma propriedade Hibernate-mapeados e, portanto, não realmente ter uma coluna na tabela? Isso explicaria a segunda mensagem de erro que você recebeu em sua consulta. Você pode precisar remover a "ordem por" cláusula de bem e fazer a sua classificação em Java se esse for o caso.

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