2016-05-26 8 views
0

Ich habe JavaFX Anwendung mit TreeTableView.Hibernate: wie man Karte zurückgibt <String, Liste <Object>>

Ich möchte die Liste der Produkte in Baum zeigen. Die erste Baumebene muss Product.article enthalten. Zweite Ebene der Baum muss Liste von Produkten enthält Product.article, wie folgt aus:

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

Ich habe dies entwickelt mit foreach auf Liste <String article> aber Datenbanktabelle auf die Produktion mehr als 1000 Artikel enthalten wird. Jeder Artikel sollte eine Liste von Produkten aus der Datenbank nach verschiedenen Abfragen enthalten. Es wird so langsam ...

Gibt es eine Möglichkeit, Ergebnissatz der Hibernate-Abfrage als Map <String article, List<Product>> zu erhalten?

S.S .: Entschuldigung für mein schlechtes Englisch.

+0

Funktioniert es die gesamte 'Liste ' für alle Artikel in einer einzigen Abfrage zu erhalten, Organisieren Sie sie dann in die Struktur, die Sie auf der Client-Seite benötigen? Auf diese Weise haben Sie nur eine (große) Abfrage. Das Backing-Modell für das TreeTableView benötigt aus Ihrer Beschreibung ohnehin die gesamte Datenliste. –

+0

Ja, ich möchte eine einzelne Abfrage, dann organisieren Sie sie in der Struktur auf der Client-Seite. Aber jetzt habe ich über 1000 Abfragen an Datenbank für Show-Liste von Produkten, wenn mein Rahmen geladen wird. Ich meine, das ist eine schlechte Entscheidung. – Virkom

Antwort

1

können Sie rufen alle Produkte als List<Product> in einer Abfrage mit

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

und dann organisieren sie:

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

Das einigermaßen effizient sein sollte, da es nur eine einzige Abfrage enthält, und vorausgesetzt, du brauchst sowieso alle Daten, du musst es irgendwie bekommen. Die "Gruppierung nach" -Operation ist mehr oder weniger linear in der Anzahl der Produkte (denke ich), und wahrscheinlich ist die Zeit vernachlässigbar verglichen mit der Ausführung der Abfrage.

(Natürlich können Sie dies in einem einzigen Schuss tun, obwohl es genau das Gleiche tut):

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

Danke. Ich meine, diese Lösung ist besser als meine. – Virkom

Verwandte Themen