Boa noite,
Meu IN/NOT IN está funcionando perfeitamente:
subSelect = String.format("SELECT DISTINCT %s FROM %s WHERE %s = %d", filter.getString("fieldSubSelect"), filter.getString("tableRelated"), filter.getString("fieldWhere"), values.get(0));
valuesSubSelect = hibernateTemplate.find(subSelect);
criteria.add(Restrictions.in(field, valuesSubSelect));
Mas agora caí em um porém:
Quando o valuesSubSelect retorna uma lista de valores, beleza, funciona perfeitamente. Mas nem sempre esse subSelect trará dados, as vezes virá vazio, e aí que está o problema, o IN será montado IN() com parametro vazio. Ocorre erro de sintaxe no IN/NOT IN:
41541 ["http-bio-8080"-exec-4] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 1064, SQLState: 42000
41541 ["http-bio-8080"-exec-4] ERROR org.hibernate.util.JDBCExceptionReporter - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '))' at line 1
Hibernate: select this_.id as id2_0_, this_.nome as nome2_0_ from modulo this_ where not (this_.id in ())
Alguma sugestão?
Obrigado!
Resolvi fazendo o seguinte:
subSelect = String.format("%s IN(SELECT DISTINCT %s FROM %s WHERE %s = %d)", field, filter.getString("fieldSubSelect"), filter.getString("tableRelated"), filter.getString("fieldWhere"), values.get(0));
criteria.add(Restrictions.sqlRestriction(subSelect));
Obrigado!
[quote=fabiojpoli]Resolvi fazendo o seguinte:
subSelect = String.format("%s IN(SELECT DISTINCT %s FROM %s WHERE %s = %d)", field, filter.getString("fieldSubSelect"), filter.getString("tableRelated"), filter.getString("fieldWhere"), values.get(0));
criteria.add(Restrictions.sqlRestriction(subSelect));
Obrigado![/quote]
Cara, poderia me dizer da onde você tira os parametros “field”, etc, que está utilizando no String.format para substituir os %s e %d?
Se puder colocar o bloco todo …
Obrigado!
[quote=danistation][quote=fabiojpoli]Resolvi fazendo o seguinte:
subSelect = String.format("%s IN(SELECT DISTINCT %s FROM %s WHERE %s = %d)", field, filter.getString("fieldSubSelect"), filter.getString("tableRelated"), filter.getString("fieldWhere"), values.get(0));
criteria.add(Restrictions.sqlRestriction(subSelect));
Obrigado![/quote]
Cara, poderia me dizer da onde você tira os parametros “field”, etc, que está utilizando no String.format para substituir os %s e %d?
Se puder colocar o bloco todo …
Obrigado!
[/quote]
Cara, esse é um metodo muito especifico de filtro que vem de um escopo enorme, pra ti entender pra que serve e como funciona eu teria de explicar todo o contexto pra ti. Só tenho oq lhe dizer q é como o codigo acima, ou seja, 3 Strings e 1 Integer (campo, tabela, nome do campo para a condicao e o valor para a condicao - para um filtro generico que implementei)… Do que exatamente vc precisa? O que quer fazer?