2010-08-06 36 views
7

Điều này có thể chuyển đổi trong createCriteria() không?Có 'không tương đương' trong GORM không?

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

Tôi biết có một nhà điều hành 'trong' và đây là những gì tôi có cho đến nay:

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

Chỉ muốn để xem nếu điều này là có thể. Nếu không, tôi đoán điều này là có thể trong HQL phải không?

Trả lời

19

nhờ Sammyrulez cho mã. có một ý tưởng từ đó. thử nghiệm nó nhưng nó không hoạt động. tôi đã sửa nó và đây là mã làm việc cuối cùng:

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

bây giờ tôi biết cách sử dụng toán tử 'không'. cảm ơn rất nhiều!

8

không tự mình thử nhưng nhìn vào tài liệu Grails và hibernate api bạn tạo các nút trên bản đồ trình xây dựng này với các phương thức tĩnh được tìm thấy trong lớp Hạn chế của Tiêu chí Hibernate API 1. Vì vậy, một cái gì đó giống như

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

Kể từ khi bạn chuỗi trong phương pháp (mà trả về một Criterion) với không phương pháp (mà phải mất một Criterion như là đối số và trả về một phiên bản phủ nhận)

+3

cảm ơn cho mẫu mã. có ý tưởng về cách sử dụng toán tử 'không'. – firnnauriel

1

đây là giải pháp:

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

Theo tài liệu Grails về việc tạo ra các tiêu chí here, bạn có thể sử dụng một cái gì đó như thế này:

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

Trong ví dụ này, bạn có một tài sản có tên "age" và bạn muốn nhận các hàng KHÔNG nằm trong khoảng từ 18 đến 65. Tất nhiên, phần [18..65] có thể được thay thế bằng bất kỳ danh sách giá trị hoặc phạm vi nào bạn cần.

1

Chỉ cần ghi nhớ: trong trường hợp này, bạn không cần phải sử dụng dấu ngoặc và bạn có thể sử dụng inList, ví dụ:

not { inList 'age',[18..65] } 
Các vấn đề liên quan