lipe82
Junho 7, 2010, 12:04pm
#1
Pessoal, para eu fazer uma procura usando LIKE e OR com hibernate, como eu faço?
String[] temp = searchParam.split(SystemWideConstants.SEARCH_DELIMITER_CHAR);
for (int i = 0; i < temp.length; i++) {
queryInput = temp[i];
Criterion criterion = null;
criterion = Restrictions.ilike(field, PERCENT_SIGN + queryInput + PERCENT_SIGN);
criteria.add(criterion);
}
Desse jeito ele entende apenas AND.
Como eu faço
Vlw
Leia mais sobre conjunctions (AND) e disjuntions (OR).
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.html#querycriteria-narrowing
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "Fritz%") )
.add( Restrictions.or(
Restrictions.eq( "age", new Integer(0) ),
Restrictions.isNull("age")
) )
.list();
lipe82
Junho 7, 2010, 2:02pm
#3
Cara, pelo o que eu entendi eu não consigo com esse exemplo fazer
SELECT * FROM COMMAND_MAPPINGS
where COMMAND_NAME LIKE 'xxxxx%' OR COMMAND_NAME LIKE '%yyyy%';
Eu vou ter uma lista de string que eu quero procurar com LIKE, % e OR.
Esse exemplo tem OR apenas para duas strings e depois tenho q usar outro Restriction.or(x, y), ai ele entende como AND e estraga a minha pesquisa
Sim, você pode fazer qualquer consulta. No caso do seu exemplo eu faria algo como:
[code]Criteria c = session.createCriteria(CommandMappings.class);
c.add( Restrictions.or(
Restrictions.ilike( “commandName”, ‘xxxxx’, Matcher.START),
Restrictions.ilike( “commandName”, ‘yyyy’, Matcher.ANYWHERE)
));
List results = c.list();[/code]
lipe82
Junho 7, 2010, 4:03pm
#5
Cara, na boa, eu não to conseguindo fazer nada com o seu código.
Matcher.START e Matcher.ANYWHERE não exstem, o q existe é matcher.start() q não é statico.
o seu código
c.add( Restrictions.or(
Restrictions.ilike( "commandName", 'xxxxx', Matcher.START),
Restrictions.ilike( "commandName", 'yyyy', Matcher.ANYWHERE)
));
funciona para dois itens muito bem! Mas e para 3? Tenho uma lista ai qd adiciono o terceiro item ficará um código assim
String queryInputTwo = null;
if(0 < temp.length) {
queryInput = temp[0];
}
int i = 0;
while(i < temp.length) {
if(i==0) {
i++;
}
if(i < temp.length) {
queryInputTwo = temp[i];
}
criteria.add( Restrictions.or(
Restrictions.ilike( field, PERCENT_SIGN + queryInput + PERCENT_SIGN, MatchMode.START),
Restrictions.ilike( field, PERCENT_SIGN + queryInputTwo + PERCENT_SIGN, MatchMode.ANYWHERE)));
i++;
queryInput = queryInputTwo;
}
ou
int i = 0;
while(i < temp.length) {
queryInput = temp[i];
criteria.add( Restrictions.or(
Restrictions.ilike( field, PERCENT_SIGN + queryInput + PERCENT_SIGN),
Restrictions.ilike( field, null)));
i++;
}
O hibernate coloca AND entre os OR, ainda não funciona
Deve ter algum método que eu não sei usar, algo assim.
[quote=lipe82]Cara, na boa, eu não to conseguindo fazer nada com o seu código.
Matcher.START e Matcher.ANYWHERE não exstem, o q existe é matcher.start() q não é statico.[/quote]
Eu te dei o caminho e por preguiça você não correu atrás para tentar corrigir um pequeno erro. Se você ler a documentação poderá entender melhor. Como estou postando isso do celular postei sem querer errado. O correto é usar a classe org.hibernate.criterion.MatchMode.
[quote=lipe82]o seu código
c.add( Restrictions.or(
Restrictions.ilike( "commandName", 'xxxxx', Matcher.START),
Restrictions.ilike( "commandName", 'yyyy', Matcher.ANYWHERE)
));
funciona para dois itens muito bem! Mas e para 3? Tenho uma lista ai qd adiciono o terceiro item ficará um código assim[/quote]
De novo, se você tivesse pelo menos seguido o link que te enviei acharia a solução. Restrictions.or funciona apenas para dois, conforme diz na documentação. Mas você pode usar o Disjunction (lembra que te falei para pesquisar sobre isso?!).
Criteria c = session.createCriteria(CommandMappings.class);
Disjunction or = Restrictions.disjunction();
or.add(Restrictions.ilike( "commandName", 'xxxxx', MatchMode.START));
[...] quantos você quiser
c.add(or);
lipe82
Junho 7, 2010, 5:16pm
#7
Fmz rapaz, desculpa a forma de perguntar, mas não tinha achado nada naquela página como vc escreveu agora
Disjunction or = Restrictions.disjunction();
or.add(....
Realmente estava um pouco complicado para eu entender o Disjuction
Com essa última eu resolvi. Obrigado pela ajuda!
lipe82, desculpe por ser tão ríspido.
Qualquer coisa que precisar, avise.
Abraços