성배 : 자기 참조 된 일대적인 관계에서 모든 어린이를 찾으십시오.

StackOverflow https://stackoverflow.com/questions/1220350

  •  10-07-2019
  •  | 
  •  

문제

성배에서

일대일 관계에서 모든 아이들을 어떻게 찾을 수 있을까요?

class Employee {
    static hasMany = [ subordinates: Employee ]
    static belongsTo = [ manager: Employee ]
}

단일 관리자를 사용하면 어떻게 모든 부하 직원의 부하 직원을 어떻게 얻을 수 있습니까?

도움이 되었습니까?

해결책

도메인을 수정하지 않으려면 재귀 클로저가 작동합니다. 그렇지 않으면 과도 속성을 추가 할 수 있습니다 Employee 도메인 클래스와 같은 allSubordinates 이 예에서 :

class Employee {
    String name
    static hasMany = [ subordinates: Employee ]
    static belongsTo = [ manager: Employee ]
    static transients = ['allSubordinates']
    def getAllSubordinates() {
        return subordinates ? subordinates*.allSubordinates.flatten() + subordinates : []
    }
}

다음은 작동중인 통합 테스트입니다.

import grails.test.*

class EmployeeTests extends GrailsUnitTestCase {
    Employee ceo
    Employee middleManager1, middleManager2
    Employee e1, e2, e3, e4, e5, e6

    protected void setUp() {
        super.setUp()
        ceo = new Employee(name:"CEO")
            middleManager1 = new Employee(name:"Middle Manager 1")
                e1 = new Employee(name:"e1")
                e2 = new Employee(name:"e2")
                e3 = new Employee(name:"e3")
            middleManager2 = new Employee(name:"Middle Manager 2")
                e4 = new Employee(name:"e4")
                e5 = new Employee(name:"e5")
                e6 = new Employee(name:"e6")

        ceo.subordinates = [middleManager1, middleManager2]
        middleManager1.subordinates = [e1,e2,e3]
        middleManager2.subordinates = [e4,e5,e6]
        assert ceo.save()
    }

    void testAllSubordinates() {
        def topLevelManager = Employee.get(ceo.id)
        assertNotNull(topLevelManager);
        assertEquals(8, topLevelManager.allSubordinates?.size())
    }
}

다른 팁

 //Make a recursive closure
 def printAll

 printAll = { emp ->
    subordinates.each { 
                        println it
                        printAll emp
                      }
 }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top