2010-08-06 20 views
7

¿Es esto posible convertir en createCriteria()?¿Hay un equivalente 'no en' en GORM?

SELECT * FROM node WHERE (node.type = 'act' AND nid NOT IN (SELECT nid FROM snbr_act_community)) LIMIT 10 

Yo sé que hay un operador 'en' y esto es lo que tengo hasta ahora:

def c = VolunteerOpportunity.createCriteria() 
def matchingActs = c.list { 
    node { 
     eq('type', 'act') 
    } 
    maxResults(10) 
} 

que desea es ver si esto es posible. De lo contrario, supongo que esto es posible en HQL ¿verdad?

Respuesta

19

gracias Sammyrulez para el código. tengo una idea de eso. lo probó pero no funcionó. lo arreglé y aquí está el código de trabajo final:

def ids = [14400 as long, 14401 as long] 

def c = VolunteerOpportunity.createCriteria() 
def matchingActs = c.list { 
    node { 
     eq('type', 'act') 
     not { 'in'(ids) } 
    } 
    maxResults(10) 
} 

ahora sé cómo usar el operador 'no'. ¡muchas gracias!

8

no lo intenté yo mismo pero al mirar las aplicaciones Grails doc e hibernate creas nodos en este mapa de compilador con los métodos estáticos encontrados en la clase Restricciones de la API de criterios de Hibernate 1. Así que algo como

def c = VolunteerOpportunity.createCriteria() 
def matchingActs = c.list { 
    node { 
     not(in('propertyName', ['val1','val2'])) 
    } 
    maxResults(10) 
} 

Dado que se encadenan el en el método (que devuelve un Criterio) con el método no (que lleva un criterio como argumento y devuelve una versión negada)

+3

gracias por el código de ejemplo. Tengo una idea sobre cómo usar el operador 'no'. – firnnauriel

1

Ésta es la solución:

def resultat=EnteteImputationBudgetaire.createCriteria().get{ 
      between("dateDebutPeriode", dateDebut, dateFin) 

      and{ eq 'natureImputationBudgetaire','FONCTIONNEMENT' } 
      maxResults(1) 
     } 

     def resultat2=ParametragePlanBudgetaire.createCriteria().list() { 
      like('composantBudgetaire','6%') 
      if(resultat?.details) { 
       not { 
        'in'('composantBudgetaire',resultat?.details?.imputationBudgetaire) 
       } 
      } 
     } 
1

Según la documentación Griales sobre la creación de criterios here, se puede usar algo como esto:

not {'in'("age",[18..65])} 

En este ejemplo, usted tiene una propiedad denominada "age" y desea obtener filas que NO estén entre 18 y 65. Por supuesto, la parte [18..65] se puede sustituir con cualquier lista de valores o rango que necesite.

1

Tan sólo recordar: en este caso no tiene que utilizar paréntesis y se puede utilizar inList, por ejemplo:

not { inList 'age',[18..65] } 
Cuestiones relacionadas