0

Iは、次のエンティティとアプリケーションを持っていますトピックをユーザーに問い合わせる:基準のGrails

def visibleTopics = Topic.findAllByVisibility(true, [sort:"name", order:"asc"]) 

このクエリは、たとえば[['English'], ['Spanish']]のように返します。次に、各トピックに関する完全な情報をユーザーに表示できます。

しかし、表示可能な各トピックのアクティブなテストの数をユーザーに示したいと考えています。例えば

English topic has 2 active test. 
Spanish topic has a total of 2 test. One is active and the other is not. 
German topic has not any active test. 

そして私は、その結果であるクエリを必要とする:def activeTotalEachTopic = [[2],[1],[0]]及びIビュー(.gsp)にactiveTotalEachTopic変数を渡すことができます。

ソリューション:

私はすべての可視トピックを得ることができます最初のクエリから、私は、アクティブなテストの数を取得します。

def visibleTopics = Topic.findAllByVisibility(true, [sort:"name", order:"asc"]) 

def numberActiveTest = [] 

activeTopics.each { topic -> 
    def result = Test.findAllByTopicAndActive(topic, true).size() 
    numberActiveTest.push(result) 
} 

そして両方の変数を表示します。

render view: 'home', model: [activeTopics: activeTopics, numberActiveTest: numberActiveTest] 

答えて

0

あなたが欠けているものは、合計カウントではなくグループごとのカウントを得るようにグループ化されていることです。

アクティブなテストのないトピックが0を返すようにするには、デフォルトの内部結合から外部結合に結合タイプを変更する必要があります。ただし、この副作用は、関連プロパティの参照方法を変更することです結合によって作成されたエイリアスが原因です。このような何か:[['English', 2],['Spanish', 1],['German', 0]]

import static org.hibernate.sql.JoinType.* 

def activeTotalEachTopic = Topic.createCriteria().list() { 
    createAlias('tests', 't', LEFT_OUTER_JOIN) 

    eq 'visibility', true 

    or { 
     eq 't.active', true 
     isNull 't.id' 
    } 

    projections { 
     groupProperty 'name' 
     count() 
    }   
    order ("name", "asc") 
} 

さて、アドレスに別の問題は、出力がグループ化のためにこのようなものになるだろうということです。あなたができることは、各サブリストの2番目の項目を収集することです:

activeTotalEachTopic*.getAt(1) 

// Which is the equivalent of... 

activeTotalEachTopic.collect { it[1] } 
+0

ありがとう。完全には機能しません。したがって、アクティブなテストのトピックのみを表示するので、 '[[English '、2]、[' Spanish '、1]]'となります。 **ドイツのトピック**はリストにありません。 –

+0

OK、問題を解決しました。問題は、関連するテストがない場合、 't.active'がnullになり、その結果、条件が失敗することです。だから、ヌルチェックで修正されます。 –

+0

問題は引き続き発生します。アクティブなテストのないトピックは表示されません。投影セクションを省略すると、2つのトピックのみが表示されます。 3番目は表示されません(ドイツ語)。 –