2016-05-26 9 views
0

私はJavaFXのアプリケーションTreeTableViewを持っています。Hibernate:マップを返す方法<String、List <Object>>

ツリー内に商品のリストを表示したいと思います。ツリーの第1レベルにProduct.articleが含まれている必要があります。

article1/ 
    -- name model sizes 
    -- name model sizes 
article2/ 
    -- name model sizes 
    -- name model sizes 

Iを一覧<String article>上のforeachでこれを開発してきたが、生産上のデータベース・テーブルが1000以上の記事が含まれているだろう:ツリーの第二のレベルは、このように、製品のリストがProduct.articleが含まれている必要があります。各記事には、データベースからの製品のリストが個別のクエリによって作成されている必要があります。それは遅くなるでしょう...

マップ<String article, List<Product>>としてHibernateクエリの結果セットを取得する方法はありますか?

P .:私の悪い英語を申し訳ありません。それだけで単一のクエリを必要とするよう合理的に効率的でなければなりません

Map<String, List<Product>> productsByArticle = allProducts.stream() 
    .collect(Collectors.groupingBy(Product::getArticle)); 

、および:

+0

それは、単一のクエリ内のすべての記事のための全体 '一覧'を取得するために動作します、クライアント側で必要な構造に整理しますか?そうすれば、1つの(大規模な)クエリが得られます。あなたの説明から、 'TreeTableView'のバッキングモデルは、とにかくデータのリスト全体を必要とします。 –

+0

はい、私は単一のクエリをしたい、そして、クライアント側の構造にそれらを整理します。しかし、私は、フレームがロードされているときに、製品のリストを表示するために1000を超えるクエリをデータベースに持っています。つまり、これは悪い決断です。おかげさまで – Virkom

答えて

1

あなたは

TypedQuery<Product> query = em.createQuery("select p from Product p", Product.class); 
List<Product> allProducts = query.getResultList(); 

を使用してList<Product> 1で、クエリなど、すべての製品を取得し、それらを整理することができますとにかくすべてのデータが必要な場合は、何とかそれを取得する必要があります。 「グループ化」操作は製品の数に多かれ少なかれ直線的であり、クエリの実行に比べると時間がかかりそうです。

(それはまったく同じことをやっているものの明らかに、あなたは、単一のショットでこれを行うことができます):

TypedQuery<Product> query = em.createQuery("select p from Product p", Product.class); 
Map<String, List<Product>> productsByArticle = query.getResultList().stream() 
    .collect(Collectors.groupingBy(Product::getArticle)); 
+0

私はこのソリューションが私のほうが優れていることを意味します。 – Virkom

関連する問題