2011-05-03 3 views
0

이 질문은 Grails의 정적 매핑 블록에서 수식 필드 사용과 관련이 있습니다.Grails 수식 필드를 찾을 수 없음

수식 매핑 (파생 된 속성)을 사용하는 매우 간단한 도메인 클래스를 구현하려고하지만 Grails 도메인 클래스에서 파생 된 속성 인 가동 시간이 "No property found for name [uptime]"이됩니다. 다음 코드는 간체이다

class Derive { 
    Integer up 
    Integer down 

    static mapping = { 
    uptime formula : "UP/(DOWN+UP)" 
    } 
} 

class DeriveTests extends GroovyTestCase { 

    void testDerivedProp() { 
     new Derive(up:10, down:5).save() 
     new Derive(up:5, down:5).save() 
     assertEquals Derive.all.size(),2 

     assertEquals 2,Derive.findAllByUptimeGreaterThan(0.1).size() //fails here 
     assertEquals 2,Derive.findAllByUptimeGreaterThan(10/(10+5)).size() 
    } 
} 

테스트를 실행하면 제 assertEquals 저에게 오류를 제공 : org.codehaus.groovy.grails.exceptions.InvalidPropertyException: No property found for name [uptime] for class [class Derive]. Grails In Action과 reference docs을 여러 번 살펴본 결과 여기서 내가 잘못하고있는 것을 볼 수 없습니다.

제가 잘못하고있는 것에 대한 단서가 있습니까? 백업 데이터베이스는 기본 설정 (grails create-app에 의해 생성 됨)으로 메모리에서 실행되는 HSQLDB입니다.

편집 : 수식에 대한 속성 필드를 추가할지 여부를 약간 확신 할 수 없습니다. 속성 필드 'Double uptime'을 추가하면 어설 션은 여전히 ​​실패하지만 가동 시간이 0이기 때문에 이번에는 실패합니다. 디버거에서 개체를 보면 가동 시간이 null임을 알 수 있습니다. 그래도 SQL 출력은 나에게 맞는 것으로 보여줍니다. hibernate.SQL select this_.id as id6_0_, this_.version as version6_0_, this_.down as down6_0_, this_.up as up6_0_, this_.UP*100/(this_.DOWN+this_.UP) as formula0_0_ from derive this_

+0

나는 그것을 해결 한 것 같다. 약간. 작동 시키려면 Double이라는 uptime 필드를 추가해야합니다. 수식에서 나눗셈에 의해 반환되는 수는 float이기 때문에 이것이 충분해야한다고 생각했을 것입니다. 그러나 결과는 항상 0이므로 정상적인 정수 나누기 규칙이 적용되는 것처럼 보입니다. 테스트를 수행하려면 세 필드가 모두 Doubles임을 지정해야합니다. 모든 것이 작동하더라도 파생 값에 대해 개체를 쿼리하면 여전히 null이 제공됩니다. 그림을 이동. – oligofren

+0

나는 왜 그것이 속성에서 null을 반환하는지 알아 냈습니다. Ziad Jayyousi의 대답에 따라 저의 마지막 코멘트를보십시오. – oligofren

답변

2

동안의 새로운 답변, 그래서 나는 합계를 업 게시 오전 :

  • 는 한 느낌이 있어야한다 d를 입력하면 공식이 작동합니다.
  • 파생 된 속성은 데이터베이스 검색과 관련되어 항상 검색 할 수 있지만 저장된 버전이 여전히 캐시에 있으면 개체의 속성이 항상 null입니다. 즉, 검색하기 전에 세션 캐시를 지우거나 캐시 된 객체를 새로 고침 (obj.refresh())

수동으로 새로 고침하는 마지막 비트는 매우 기분이 좋지 않지만 그 주위에 방법을 찾지 못했습니다.

1

첫 번째 : 가동 시간은 기본도 클래스 유형도 아닙니다. 또한 그 문제에 대한 매핑을 왜 사용하는지 잘 모르겠습니다. 또는 당신은 당신의 클래스의 과도 특성 "가동 시간"을 만든 다음 그것을 getter 메소드 줄 수 :

내가 대신 정수의 두 번을 사용합니다 : 다음

class Derive { 
    Integer up 
    Integer down 
    static transients = ['uptime'] 

    Integer getUptime(){ 
     Integer uptime = up/(down+up)  
     return uptime 
    } 
} 

코드에 액세스 할 수 :

def derive = new Derive() 
def uptime = derive.uptime 
+0

"가동 시간이 원시적이거나 클래스 유형이 아닙니다"라는 것은 무엇을 의미합니까? 그것은 유형이 없다는 것을 의미합니까? 그렇다면 이름과 유형이 포함 된 필드를 클래스에 추가해야합니까? – oligofren

+0

이유에 관해서는 ... 일반적으로 단지 그것이 작동한다는 것을 알기 쉽게 뭔가를하는 것은 나를 위해 충분합니다. – oligofren

+0

클래스 파생 { 아래 두 번까지 더블 더블 를 가동 시간 ... 이 중 하나가 작동하지 않는 이유 어떤 생각? 정수 나누기는 여기에 없지만 테스트에서는 0/null 만 남습니다. – oligofren