2012-01-10 14 views
13

ドメインクラスのすべてのID反復処理するための最良の方法:Grailsの私は、このようなコード持って

Book.list().each { 
    // real code actually does something more useful 
    println "My id is " + it.id 
} 

それは、各ブックのオブジェクト全体だけでアクセスするためにロードされている廃棄物のビットとして私を打つとid。 GrailsにはIDで操作したいだけのload()メソッドがあります。すべてのドメインインスタンスをロードするためにここに相当するものがあるのでしょうか?私はHQLを使うべきですか?それとも、それをそのまま残すべきですか?

PS:それは私ではなく、ブックのオブジェクトが含まれていない限り、ターゲットクラス

答えて

8

あなたはただあなたがHQLを使用しないようにしたいときの投影との組み合わせで基準のクエリはあなたの問題を解決し

Book.executeQuery("select b.id from Book b");

+0

私は 'namedQueries'を使うと言いたいと思います。あるいは、条件クエリは、特にクエリがより複雑になるにつれて、読みやすさのためにSQLよりはるかに優れています。 –

-2

を「GET」の唯一の「負荷」にそれを引き起こす最もGORMの方法が利用できるオプション(ファインダなど)があるべきかを思ってしまいますたくさんのデータがあれば、私はBook.listと一緒にシンプルにしておきます。

load()は実際にデータベースにヒットしないことを覚えておいてください。idを設定したオブジェクトを作成するだけです。

+0

私はちょうど読み込みを試みましたが、id以外の任意のプロパティにアクセスしようとするとデータベースに当たると思われます。 – aldrin

+0

はい、それはちょうど新しい本(ID:2)の代わりに.loadを使用する理由で、アクセス時にオブジェクトを遅延ロードするプロキシオブジェクトを作成します。 –

+0

Bookクラスに多くのデータ(100k未満)がない場合、Book.list()を使用しても問題ありません。 –

9

を必要とするフィールドを返すためにHQLを使用することができます。 select this_.id as y0_ from book this_

def criteria = Book.createCriteria() 
    def result = criteria.list { 
     projections { 
      property 'id' 
     } 
    } 

HibernateはSQLのログはIDのみがデータベース、全体ではなく、ブックからロードされていることを示しています。

条件クエリは、ブックドメインクラスのnamed queryとして追加することもでき、IDリストに簡単にアクセスできます。ルーベンの答え@については

5

+1、しかし、あなたは、単に

def criteria = Book.withCriteria { 
    projections { 
     property 'id' 
    } 
} 

にそれを短縮し、同じ結果を得ることができます!