2011-08-04 4 views
0

나는 아주 사소한 것이라고 생각하는 것에 도움이 필요하다. 나는 모든의 전체 크기를 필요로 할 때grails sum one-to-many

class User { 
    String name 
    static hasMany = [files : File] 
} 

class File { 
    long size 
} 

는 지금은 작동하고 다음 주어진 사용자 사용할 수있다 파일 :

def user = User.get(id) 
user.files.each(total+=it.size) 

을하지만 난 확신 할 때를 얼마나 추한, 그것을 수행 할 수 있습니다 일반 SQL 또는 내가 File.sumBySize 같은 것을 시도

GORM/선정 조건과 간단한 선택 합 쿼리 ..()와

또는

def c = File.createCriteria() 
def f = c.list{ 
    eq("user", user) // What here ? 
    projections 
     { 
     sum("size") 
     } 
    } 
는 내가 File 클래스에 있지만 Grails에 정의되지 않은 부모 (사용자)의 관계를 지정하는 방법을 잘 모릅니다

왜 못생긴 것입니다 테이블

이 어떤 도움이

+0

왜 그게 못생긴가요? 나는 그 코드를 User 도메인의 편리한 메소드에 넣기 만하면된다. 그런 다음 userInstance.totalFileSize()를 호출하십시오. – Gregg

+0

잘 모르겠습니다. 나는 이것이 물음표 수집을 반복하는 대신 쿼리에 의해 수행되어야한다고 생각합니다. 그리고 나는이 일을 다른 방법으로 만드는 방법을 알고 있습니다. 나는이 기준을 수행하는 데 실패합니다 : ( –

답변

0

HQL 쿼리를 사용하여 수행 할 수 있지만 '크기'필드의 이름에 작은 문제가 있습니다. (예약어로 표시됨). 당신이 등 '길이', '이는 파일 크기'로 이름을 변경하면 다음이 작동합니다

User.executeQuery(
    'select sum(file.length) from User u join u.files file where u.id=:userId', 
    [userId: id])[0] 
+0

고마워요! –

+0

...하지만 원래 코드, LOL보다 더 복잡해 보입니다. . –

+0

.. 알아요 : D하지만 방금 다른 옵션을보고 싶었어요. 게다가 Gorm-> hibernate-> 뒤에서 실제로 일어나고있는 것이 있습니까? 결국에는 여전히 sql입니까? 더 나은 성능을 제공하는 것이 무엇인지 궁금합니다. 데이터베이스보다 위의 작업. –

1

감사에 참여 ? 모든 파일 크기를 합산하기 위해 SQL을 전혀 사용하지 않고 한 문장 만 필요합니다. 당신이 원하는 경우지만, 당신은 과 같이 HQL을 사용할 수 있습니다 :

def user = User.get(id) 
def sum = File.executeQuery("select sum(f.size) from File f where f.user = ?", user); 

하지만 난 당신이 그렇게 할 파일에 belongsTo를 추가해야합니다 거라고 생각합니다. 아마도 조금 더 간단한 HQL/GORM 방법이있을 것입니다.하지만 솔직히 저는 이미 여러분이했던 것보다 더 쉬운 것이 없을 것이라고 생각합니다.

+0

예,이 때만 belongsTo = [사용자 : 사용자]를 추가 할 때 작동합니다. 감사합니다 –

0

더 우아한 방법을 그루비 코드에서 파일 크기를 요약하는 것은 :

def total = user.files.sum {it.size} 

그러나 경우 사용자를 반환하는 쿼리에서 파일 크기 합계를 계산할 수 있습니다. 그렇게하는 방법입니다.