Grailsには、同じことを行う方法がいくつかあります。
すべてのドメインクラスインスタンスを検索します。
Book.findAll()
Book.getAll()
Book.list()
指定されたIDのドメインクラスのインスタンスを取得します。
Book.findById(1)
Book.get(1)
それぞれをいつ使用しますか?パフォーマンスに大きな違いはありますか?
getAll
はget
の拡張バージョンで、複数のIDを取り、インスタンスのList
を返します。リストのサイズは、提供されたIDの数と同じになります。ミスがあると、そのスロットでnull
になります。 http://grails.org/doc/latest/ref/Domain%20Classes/getAll.html を参照してください
findAll
を使用すると、HQLクエリを使用でき、ページネーションがサポートされますが、呼び出しクラスのインスタンスに限定されないため、代わりにexecuteQuery
を使用します。 http://grails.org/doc/latest/ref/Domain%20Classes/findAll.html を参照してください
list
はすべてのインスタンスを検索し、ページネーションをサポートします。 http://grails.org/doc/latest/ref/Domain%20Classes/list.html を参照してください
get
は、IDで単一のインスタンスを取得します。 instanceキャッシュを使用するため、同じHibernateセッション内で複数の呼び出しを行うと、最大で1つのデータベース呼び出しが発生します(たとえば、インスタンスが2番目のレベルキャッシュを有効にしました)。
findById
は、findByName
、findByFoo
などの動的Finderです。したがって、インスタンスキャッシュは使用しませんが、クエリキャッシュを有効にしている場合はキャッシュできます(通常は良いアイデアではありません)。 get
は、キャッシュがはるかにスマートであるため、優先されるべきです。キャッシュされたクエリ結果は(このような単一のインスタンスであっても)予想よりも悲観的にクリアされますが、インスタンスキャッシュはそれほど悲観的である必要はありません。
findById
に対して使用する1つのユースケースは、別のプロパティと組み合わせたセキュリティ関連のチェックです。たとえば、CreditCard.get(cardId)
を使用してCreditCard
インスタンスを取得する代わりに、現在ログインしているユーザーを見つけて、CreditCard.findByIdAndUser(cardId, user)
を使用します。これは、CreditCard
がUser user
プロパティ。この方法では、両方のプロパティが一致する必要があります。カードIDは一致する可能性がありますが、ユーザーは一致しないため、ハッカーがカードインスタンスにアクセスするのをブロックします。
Domain.findByID(id)とDomain.get(id)のもう1つの違いは、休止状態フィルターを使用している場合、Domain.findById(id)を使用する必要があることです。 Domain.get(id)はフィルターをバイパスします。
知る限り、これらはすべて同一です
_Book.findAll()
Book.getAll()
Book.list()
_
これらは同じ結果を返します
_Book.findById(1)
Book.get(1)
_
ただし、get(id)
はキャッシュを使用します(有効になっている場合)。したがって、findById(1)
よりも優先されるべきです。