이 질문은 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_
나는 그것을 해결 한 것 같다. 약간. 작동 시키려면 Double이라는 uptime 필드를 추가해야합니다. 수식에서 나눗셈에 의해 반환되는 수는 float이기 때문에 이것이 충분해야한다고 생각했을 것입니다. 그러나 결과는 항상 0이므로 정상적인 정수 나누기 규칙이 적용되는 것처럼 보입니다. 테스트를 수행하려면 세 필드가 모두 Doubles임을 지정해야합니다. 모든 것이 작동하더라도 파생 값에 대해 개체를 쿼리하면 여전히 null이 제공됩니다. 그림을 이동. – oligofren
나는 왜 그것이 속성에서 null을 반환하는지 알아 냈습니다. Ziad Jayyousi의 대답에 따라 저의 마지막 코멘트를보십시오. – oligofren