2011-08-05 11 views
6

Tôi có hai tên miền là một phần của tàu quan hệ một-nhiều. Tôi đã tự hỏi làm thế nào tôi có thể truy vấn các con cho cha mẹ FK? dưới đây là psuedo-mã cho cha/conGrails, cách tìm bằng bản ghi bằng khóa ngoài

phụ huynh:

class AlumProfile { 
String firstName 
String lastName 
    static hasMany = [alumLanguage : AlumLanguage] 


static mapping = { 
    cache true 
    id generator: 'assigned' 

    columns { 
     firstName type:'text' 
     lastName type:'text' 
    } 

    // 
} 
static constraints = { 
    firstName (nullable:true) 
    lastName (nullable:true) 
    } 

    } 

Child:

class AlumLanguage { 
String name 
String level 

static belongsTo = [alumProfile:AlumProfile] 
static mapping = { 
    cache true 

    columns { 
     name type:'text' 
     level type:'text' 
    } 
} 
static constraints = { 
    name(nullable:true) 
    level(nullable:true) 
} 
    } 

Mặc dù tôi không tạo ra một cách rõ ràng FK, grails chăm sóc của việc tạo ra nó MySQL DB một mình. Tuy nhiên, khi tôi muốn truy vấn con của FK như thế này:

if(AlumLanguage.findByNameAndAlumProfileId(language.'language'.toString(), 'jIi-hRi4cI')==null){ 
     //do something 
} 

tôi nhận được một lỗi: Không có tài sản tìm thấy cho tên [alumProfileId] cho lớp [lớp mgr.AlumLanguage]

gợi ý Bất kỳ trên làm thế nào để thực hiện điều này?

nhờ jason

Trả lời

7

Hãy thử sử dụng một criteria:

def c = AlumLanguage.createCriteria() 
def languages = c.get { 
    eq('name', 'whatever-language') 
    alumProfile { 
     eq('id', 'jIi-hRi4cI') 
    } 
} 
+0

này trả về một danh sách. tôi cần phải có đối tượng AlumLanguages ​​được trả về, để tôi có thể chỉnh sửa/xóa các phiên bản của nó – jason

+0

Cập nhật. Tuy nhiên, nếu bạn định làm theo cách đó, bạn có thể muốn khai báo AlumProfile.alumLanguage thành một 'Set' để thực thi các thành viên duy nhất. –

+0

Cảm ơn, điều đó đã làm được! ngoài sự tò mò, bạn có ý gì bằng cách "khai báo AlumProfile.alumLanguage như một Set"? Cảm ơn một lần nữa! – jason