0

次のようなクラスがいくつかあります。

class User {
    boolean enabled
    String username
}

class ExampleClass {
    User firstUser
    User secondUser
}

私の最終目標は、 のすべてのインスタンスを見つけることですまたは のインスタンスUserが関連付けられています。enabled == trueUserExampleClass

このコードが実行されている場所では、変数名firstUserまたはsecondUser.

そうは言っても、関連付けが行われた変数 (または) に関係なく、User関連付けられた のすべてのインスタンスを見つけることができる必要があります。ExampleClassfirstUsersecondUser どうすればいいですか?

アップデート:

私が思い付くことができる最善の方法は、Userドメイン クラスのこのメソッドです。上記の例では、タイプExampleClassの複数のフィールドを持つ があります。実際、タイプUserの複数のフィールドを持つ複数のクラスがあります。Userこれが、単に入力するのではなく、渡されたオブジェクトからドメイン クラスを取得する理由ですExampleClass

static List findAllEnabledOrAssociatedWith( Object obj = null ) {
    if( obj?.id ) { // Make sure the object in question has been saved to database.
        List list = [] 
        obj.domainClass.getPersistentProperties().each {
            if( it.getReferencedPropertyType() == User ) {
                def propertyName = it.getName()
                list += User.executeQuery( "SELECT DISTINCT ${propertyName} FROM ${obj.class.getSimpleName()} obj INNER JOIN obj.${propertyName} ${propertyName} WHERE obj =:obj", [ obj: obj ] )
            }
        }
        list.unique()
        return User.executeQuery( "SELECT DISTINCT users FROM User users WHERE users.enabled=true OR users IN(:list)", [ list: list ] )
    } else {
        return User.executeQuery( "SELECT DISTINCT users FROM User users WHERE users.enabled=true" )
    }
}
4

1 に答える 1

0
def sql = '''
    from 
        User u, 
        ExampleClass ex 
    where 
        u.enabled = 1 or (u = ex.firstUser or u = ex.secondUser)'''
def users = User.findAll(sql)
于 2012-08-31T20:11:06.553 に答える