Hibernate com Expressão Regular

Srs,

Estou buscando uma forma de utilizar expressões regulares nas minhas querys do hibernate, por exemplo:


Criteria selProdutos = sessao.createCriteria(Produto.class);
selProdutos.add(Restrictions.like("nome", "Abafador", Matchmode.ANYWHERE);

Ao inves de fazer do jeito acima, gostaria de usar expressoes regulares, pois tem casos que preciso casar duas partes do mesmo campo.

Um exemplo pratico disso seria por exemplo uma pesquisa por “Jean de Souza”, deveria pesquisar “Jean de Sou[sz]a”

Obrigado.

Cara, nem todos os bancos suportam busca por regular expressions.

Dá uma olhada nesse link:
https://forum.hibernate.org/viewtopic.php?f=1&t=950394&start=0

[quote=Filipe Sabella]Cara, nem todos os bancos suportam busca por regular expressions.

Dá uma olhada nesse link:
https://forum.hibernate.org/viewtopic.php?f=1&t=950394&start=0[/quote]

Sim, estou utilizando o mysql, e meu sistema vai ser sempre mysql…

Uma query assim funciona perfeitamente no mysql:

select * from cliente where nome REGEXP 'k.*teixeira$';

Neste caso retornaria todos os clientes iniciados com K cujo o ultimo sobrenome seja teixeira.

Como o mysql nao faz distincao de maiusculas/minusculas somente essa regexp funciona perfeitamente.

Agora a minha duvida eh como passar essa regexp pro hibernate, pois se eu colocar

[code]Restrictions.eq(“nome”, “k.*teixeira$”);

//ou

Restrictions.like(“nome”, “k.*teixeira$”);
[/code]

Nao funciona

Amigo, acredito que não seja possível fazer isso com o hibernate… posso estar enganado. Mas o hibernate foi feito para abstrair os BDs, e vc está tentando usar uma funcionalidade específica de um BD… não existe REGEX no sql “de verdade”, portanto acredito que oq vc deseja realmente não será possível com o hibernate.

Eu proponho 2 soluções pra vc:
1 - Não use hibernate, se conecte direto com o seu banco.
2 - Continue usando o hibernate e crie seus prórios métodos de REGEX. (Por exemplo, no exemplo q vc deu com o Sou[sz]a, faça uma query para o Sousa e outra para o Souza.)

Você vai ter que criar seu próprio Criterion.

Algo como:

public class RegExpExpression implements Criterion {
    private String property, regexp;

    public RegExpExpression(String property, String regexp) {
        this.property = property;
        this.regexp = regexp;
    }

    public TypedValue[] getTypedValues( Criteria criteria, CriteriaQuery criteriaQuery ) throws HibernateException  {
        return new TypedValue[] { new TypedValue(Hibernate.STRING, regexp, EntityMode.POJO) };
    }
 
    public String toSqlString( Criteria criteria, CriteriaQuery criteriaQuery ) throws HibernateException {
        String column = criteriaQuery.getColumnsUsingProjection(criteria, property)[ 0 ];
        return column + " REGEXP ?";
    }
}

// para usar
session.createCriteria(Person.class)
.add( new RegExpExpression("name", "F[ie]lipe") )
.list();

NAO TESTEI. Adaptei o código daqui:
http://blog.dclick.com.br/2007/11/14/implementando-criterion-para-utilizar-extract-do-oracle/pt/