OR no hibernate

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();

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]

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);

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