2013-08-14 48 views
5

tôi có các lớp học miền A và B như sau:GORM nơi truy vấn trên một đối tượng nhúng

class A { 
    String prop1 
    String prop2 
    B prop3 

    static embedded = ['prop3'] 
} 

class B { 
    String prop4 
    String prop5 
} 

Khi tôi muốn truy vấn như thế này:

def q = A.where { prop3.prop4 == 'bla' } 
def list = q.list() 

tôi nhận được ngoại lệ sau đây:

Cannot get property 'javaClass' on null object. Stacktrace follows: 

trên dòng "def q = A.where ...".

Bất kỳ đầu mối nào là vấn đề? Tôi đã kiểm tra này:

http://grails.1312388.n4.nabble.com/GORM-embedded-object-issue-td1379137.html

nhưng làm thế nào để "chỉ cần gọi chúng trực tiếp" không phải là khá rõ ràng với tôi. Bất kỳ cách nào khác để truy vấn các đối tượng nhúng trong GORM?

Trả lời

0

gì bạn nhận được nếu bạn (giả sử B là trong src/groovy)

def q = A.where { prop3 == new B(prop4: 'bla') } 
def list = q.list() 

thành phần nhúng được tiếp tục tồn bên trong lớp tên miền chính (chủ sở hữu) của chính nó. Nó có thể được truy cập trực tiếp bằng cách sử dụng bất kỳ công cụ tìm động nào khi bạn thực hiện trực tiếp trên một đối tượng miền.

Trên đây cũng có thể được đại diện trong Finders động như:

A.findAllByProp3(new B(prop4: 'bla')) 
+0

Nó không hoạt động - nó phân tích cú pháp nhưng tôi nhận được kết quả không. Hầu hết có lẽ bởi vì nó thiếu prop5 (mà tôi không biết và không thể lọc). Bất kỳ đề xuất nào khác? Ngoài ra, làm thế nào tôi sẽ làm một "IN" truy vấn trên prop3? –

4

Cuối cùng tôi đã từ bỏ trên truy vấn ở đâu và đi với cách tiếp cận DetachedCriteria. Cung cấp cho tôi sự linh hoạt tương tự như các truy vấn nơi, nhưng hoạt động với các đối tượng miền được nhúng:

def criteria = new DetachedCriteria(A).build { 
    eq 'prop1', 'bla2' 
} 
criteria = criteria.build { 
    eq 'prop3.prop4', 'bla' 
} 
def list = criteria.list() 
+1

Câu trả lời đơn giản hơn có thể là '' 'A.findAll {eq 'prop3.prop4', 'bla'}' '' – Faraway

+0

Hãy chắc chắn rằng bạn sử dụng grails.gorm.DetachedCriteria không phải là một trong gói hibernate. – Neoecos