Pergunta

Estou usando o Hibernate para ORM do meu aplicativo Java para um banco de dados Oracle (não que os assuntos de fornecedores de banco de dados, podemos mudar para outro banco de dados um dia), e eu quero recuperar objetos do banco de dados de acordo com user-fornecidos cordas. Por exemplo, ao procurar por pessoas, se o usuário está olhando para as pessoas que vivem em 'fran', eu quero ser capaz de dar o seu povo em San Francisco.

SQL não é o meu forte, e eu prefiro código de construção Criteria do Hibernate para strings codificadas como ela é. Alguém pode me apontar na direção certa sobre como fazer isso no código, e se impossível, como o SQL embutido deve ser semelhante?

Obrigado,

Yuval = 8 -)

Foi útil?

Solução

Para o caso simples que você descreve, olhada Restrictions.ilike (), que faz uma pesquisa diferencia maiúsculas de minúsculas.

Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.ilike('town', '%fran%');
List results = crit.list();

Outras dicas

Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.ilike('town', 'fran', MatchMode.ANYWHERE);
List results = crit.list();

Se você usar HibernateTemplate da Primavera para interagir com Hibernate, aqui está como você faria um caso de busca insensível no endereço de e-mail de um usuário:

getHibernateTemplate().find("from User where upper(email)=?", emailAddr.toUpperCase());

Você também não tem que colocar no '%' wildcards. Você pode passar MatchMode (< a href = "http://www.hibernate.org/hib_docs/v3/api/org/hibernate/criterion/MatchMode.html" rel = "nofollow noreferrer"> documentação para versões anteriores aqui ) em para contar a busca como se comportar. START, ANYWHERE, partidas EXACT e END são as opções.

A abordagem usual para ignorar caso é converter ambos os valores do banco de dados e o valor de entrada para maiúsculas ou minúsculas - o sql resultante teria algo como

select f.name from f where TO_UPPER(f.name) like '%FRAN%'

Em critérios de hibernação restrictions.like (...). IgnoreCase ()

Estou mais familiarizado com Nhibernate modo que a sintaxe pode não ser 100% exato

para algumas informações mais Veja pro hibernate 3 extrato e hibernate docs 15,2. Estreitando o conjunto de resultados

A maioria dos agrupamentos de banco de dados padrão não são case-sensitive, mas no mundo do SQL Server pode ser definida no exemplo, o banco de dados eo nível de coluna.

Você poderia olhar usando Compass um invólucro acima Lucene.

http://www.compass-project.org/

Ao adicionar algumas anotações ao seu domínio objetos que você começa alcançar este tipo de coisa.

Compass fornece uma API simples para trabalhar com Lucene. Se você sabe como usar um ORM, então você vai se sentir em casa com bússola com operações simples para salvar e excluir & consulta.

A partir do próprio site. "Construir em cima do Lucene, Compass simplifica padrões de uso comum do Lucene, como a busca de estilo Google, atualizações de índice como conceitos bem como mais avançadas, como cache e fragmentação de índice (sub índices). Compass também usa construído em otimizações para commits concorrentes e fusões ".

Eu usei isso no passado e acho que é ótimo.

Isso pode também ser feito usando o critério de exemplo, no pacote org.hibernate.criterion.

public List findLike(Object entity, MatchMode matchMode) {
    Example example = Example.create(entity);
    example.enableLike(matchMode);
    example.ignoreCase();
    return getSession().createCriteria(entity.getClass()).add(
            example).list();
}

Apenas uma outra maneira que eu acho útil para realizar o acima.

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