2016-09-03 3 views
0

私のコードは動作していますが、Springでの私の経験は1週間のようなもので、どのように動作するのか、コードをできるだけ効率的にする方法を理解したい。Hibernate Springで効率的に作業する

最初の例: 私は私のデータベースにグループオブジェクトを持っており、各グループが、私はこのグループに関連した160件の記事を持っているので @OneToMany

public List<Group> findAllGroups() { 
    Criteria criteria = getSession().createCriteria(Group.class); 
    return (List<Group>) criteria.list(); 
} 

はこの同じグループの160でリストを返すの記事がありますだから私は追加しました:

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 

本当に効率的ですか?私は同じリストを取得してフィルタリングするだけではないということですか?

どのようにして1回だけ行うのですか?

第二の例:。

私は各グループが持っているどのくらいのポストを知りたいと、私は(group.findAllPostsを使用したくない)サイズ()、私はそれについて何をすべき?

この種のことを知っておくことは非常に重要です。なぜなら、「私は春になることができます」と言って、あまりにも多くのリソースを浪費しているからです。

+1

まあ、実際には、私は1週間後、または1ヶ月後でさえ、 "私は春に発展する"とは言えません。 – Kayaman

+0

あなたは2年以上のSpringの経験を持つことができます。そして、まだ****のようなコードです。それはポイントではありません、ポイントは、私は物事がどうやってどのように働くのか、なぜ彼らがそうするのかを理解したいのです。 – Anonymous

+0

理解したいのは良いことです。 「あなたが私に理解させてもらいたい」と言うのは悪いことです。それは広すぎる。具体的な質問を作成してください。 – Kayaman

答えて

0

少なくとも問題のあるデータベースでは、特に問題はありません(状況にもよるが)。それがあったとしても、あなたには選択肢がありません。結果を自分自身でフィルタリングするか、データベースと休止状態にして処理します(よりうまく処理できます)。

グループサイズについては、集計関数が必要です(または使用する必要があります)。 SQLではSELECT groupid, COUNT(*) FROM posts GROUP BY groupidのようなものになります。 HQLにはかなり似たものがあり、基準APIにはProjectionsがあります。

+0

あなたには選択肢がありません。 SELECT * FROM 'groups'というクエリを手動で送ると、私は正確にすべてのグループを取得し、グループへの参照を持つ投稿によって引き起こされた重複は取得しません。問題は、これを冬眠のやり方でどうやってやるかということです。 Countも投稿を繰り返します。投稿の量を保存している各グループに列を追加し、Hibernateを追加/削除するたびに更新できますか? – Anonymous

+1

できます。しかし、それは恐ろしい考えです。これは、基本的なデータベース設計だけで、休止状態などとは関係ありません。投稿数のカウントにデータベースの問題がある場合は、データベース構造が悪いだけで、それを変更する必要があります。 Hibernateは多くのことを行うことができますが、魔法のように悪いデータベース構造を修正することはできません。 –

+0

@Anonymous Hibernateは、投稿との関係を持っているので、実際に 'SELECT * FROM groups JOIN posts'を実行しています。あなたはエンティティを取り出すことに興味がありますか、エンティティの量はまったく違っています。 Florianのコメントに対する完全なサポートあなたがデータベース設計について知らないなら、効率的なHibernateの使い方を理解しようとすることは全く不可能です。 – Kayaman

関連する問題