Query com um método na clausula where

4 respostas
marvinla

Olá pessoal!

Gostaria de saber se tem como fazer uma consulta com HQL ou Criteria utilizando um método na clausula where.
Por exemplo:

class Teste {
    public int getTeste() {
        return 1+1;
    }
}

e escrever uma query assim:

q = "from Teste teste where teste.getTeste() > 1"

Desde já obrigado!

Marcos

4 Respostas

jcmird

Amigo,
dessa forma que vc quer fazer a sua clausula where nao vai funcionar. Vai dar erro no select pois vc tá passando o metodo da classe.

marvinla

jcmird:
Amigo,
dessa forma que vc quer fazer a sua clausula where nao vai funcionar. Vai dar erro no select pois vc tá passando o metodo da classe.

Então, gostaria de saber se tem como fazer isso de alguma forma. Imagina o seguinte: tenho um método que retorna se o objeto está em um estádo válido:

class Order {
public boolean isValid() {
    return this.isOpen() || this.isPending();
}
}

Então gostaria de trazer todas as Order que sejam validas. Nesse caso eu teria que duplicar o código do isValid na query HQL.
Se eu pudesse usar o método na HQL seria o ideal. Outra saida, seria processar o resultado da query e colocar um filtro:

it = orders.iterator();
while (it.hasNext()) {
    Order o = (Order)it.next();
    if (! o.isValid()) continue;

    // restante do código.
}

Mas ai eu teria que trazer todos os registros, o que não é uma boa ideia.

Alguma sugestão?

Obrigado,
Marcos

skalinichenko

Entendi o que você quer fazer.
Um dia já precisei! Mas não fiz com HQL…
Fiz uma PROC no banco e foi a saída que encontrei!
T-SQL foi a resposta dessa minha pergunta!
Mas se alguém souber, como faz isso com HQL, me interessaria bastante.
Flw!

marvinla

skalinichenko:

Fiz uma PROC no banco e foi a saída que encontrei!
T-SQL foi a resposta dessa minha pergunta!..
Flw!

Então, nesse caso, a lógica estaria na PROC, que vai me retornar todas as Order válidas. Ok!
Mas se em um determinado momento, eu quiser retornar uma Order qualquer do banco e verificar se ela é valida?

Uma forma mais abrangente de formular a questão: como usar a mesma lógica em um único objeto e
em uma coleção de objetos?

Se houver uma outra biblioteca externa ao Hibernate não teria problema.

Obrigado
Marcos

Criado 27 de maio de 2009
Ultima resposta 28 de mai. de 2009
Respostas 4
Participantes 3