web-dev-qa-db-ja.com

GrailsのfindAll、getAll、listの違い

Grailsには、同じことを行う方法がいくつかあります。

すべてのドメインクラスインスタンスを検索します。

Book.findAll()
Book.getAll()
Book.list()

指定されたIDのドメインクラスのインスタンスを取得します。

Book.findById(1)
Book.get(1)

それぞれをいつ使用しますか?パフォーマンスに大きな違いはありますか?

50
Arturo Herrero

getAllgetの拡張バージョンで、複数の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は、findByNamefindByFooなどの動的Finderです。したがって、インスタンスキャッシュは使用しませんが、クエリキャッシュを有効にしている場合はキャッシュできます(通常は良いアイデアではありません)。 getは、キャッシュがはるかにスマートであるため、優先されるべきです。キャッシュされたクエリ結果は(このような単一のインスタンスであっても)予想よりも悲観的にクリアされますが、インスタンスキャッシュはそれほど悲観的である必要はありません。

findByIdに対して使用する1つのユースケースは、別のプロパティと組み合わせたセキュリティ関連のチェックです。たとえば、CreditCard.get(cardId)を使用してCreditCardインスタンスを取得する代わりに、現在ログインしているユーザーを見つけて、CreditCard.findByIdAndUser(cardId, user)を使用します。これは、CreditCardUser userプロパティ。この方法では、両方のプロパティが一致する必要があります。カードIDは一致する可能性がありますが、ユーザーは一致しないため、ハッカーがカードインスタンスにアクセスするのをブロックします。

89
Burt Beckwith

Domain.findByID(id)とDomain.get(id)のもう1つの違いは、休止状態フィルターを使用している場合、Domain.findById(id)を使用する必要があることです。 Domain.get(id)はフィルターをバイパスします。

12
Brad Rhoads

知る限り、これらはすべて同一です

_Book.findAll()
Book.getAll()
Book.list()
_

これらは同じ結果を返します

_Book.findById(1)
Book.get(1)
_

ただし、get(id)はキャッシュを使用します(有効になっている場合)。したがって、findById(1)よりも優先されるべきです。

4
Dónal