2016-09-03 4 views
0

Mein Code funktioniert, aber meine Erfahrung mit dem Frühling ist wie 1 Woche alt und ich möchte verstehen, wie die Dinge funktionieren, und wie ich meinen Code so effizient wie möglich machen.Effizient arbeiten mit Hibernate Spring

erstes Beispiel: Ich habe ein Gruppenobjekt in der Datenbank und jede Gruppe hat Beiträge @OneToMany

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

dies eine Liste mit 160 von der gleichen Gruppe zurück, weil ich 160 Beiträge habe zu dieser Gruppe im Zusammenhang Also fügte ich hinzu:

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 

Ist das wirklich effizient? Ich meine, bekommt es nicht nur die gleiche Liste und filtert es nur?

Wie würde ich es so machen, es macht es nur einmal?

Zweites Beispiel:.

Ich mag wissen, wie viele Beiträge jede Gruppe und ich will nicht group.findAllPosts() verwenden, size(), Was soll ich tun?

Es ist sehr wichtig für mich, diese Art von Sachen zu wissen, weil du nicht sagen kannst "Ich kann mich im Frühling entwickeln", während ich so viele Ressourcen verschwende.

+1

Nun, man kann nicht wirklich sagen "Ich kann im Frühling entwickeln" nach einer Woche oder sogar nach einem Monat. – Kayaman

+0

Nun können Sie 2 Jahre Erfahrung mit Spring oder mehr haben .. und immer noch wie ****. Das ist nicht der Punkt. Der Punkt ist, ich möchte verstehen, wie und warum die Dinge so funktionieren, wie sie es tun. – Anonymous

+0

Es ist gut zu verstehen. Es ist schlecht zu sagen "Ich will, dass du mich verständlich machst". Es ist einfach zu breit. Versuchen Sie, spezifische Fragen zu stellen. – Kayaman

Antwort

0

Das eindeutige Problem ist nicht besonders ineffizient (natürlich abhängig von Ihrer Situation), zumindest in jeder Datenbank, die sich gut benimmt. Selbst wenn es so wäre, ist es nicht so, als hätten Sie eine Wahl. Entweder Sie filtern die Ergebnisse selbst aus oder Sie lassen die Datenbank und den Ruhezustand damit umgehen (sie machen es besser).

Für die Gruppengrößen benötigen Sie Aggregatfunktionen (oder sollten diese verwenden). In SQL wäre es so etwas wie SELECT groupid, COUNT(*) FROM posts GROUP BY groupid. HQL sollte etwas sehr ähnliches haben, und die Kriterien API hat Projections dafür.

+0

was meinst du mit dir hast keine wahl? Wenn ich diese Abfrage SELECT * FROM 'groups' manuell senden würde, würde ich genau alle Gruppen und nicht die Duplikate erhalten, die durch einen Beitrag verursacht werden, der eine Referenz auf eine Gruppe hat. Die Frage ist, wie man das im Winterschlaf macht? auch Count wird über die Beiträge iterieren, Könnte ich eine Spalte zu jeder Gruppe hinzufügen, die Anzahl der Beiträge speichern und sie mit Hibernate aktualisieren, jeweils hinzufügen/entfernen? – Anonymous

+1

Sie könnten. Aber es wäre eine schreckliche Idee. Das hat nichts mit Hibernate, etc. zu tun - nur einfaches Datenbankdesign. Wenn Ihre Datenbank Probleme hat, Buchungen zu zählen, dann ist Ihre Datenbankstruktur einfach schlecht und Sie sollten das ändern. Hibernate kann viel, aber es kann eine schlechte Datenbankstruktur nicht magisch reparieren. –

+0

@Anonymous Hibernate führt 'SELECT * FROM groups JOIN posts' aus, da es eine Beziehung zu Beiträgen hat. Sind Sie daran interessiert, Entitäten oder nur die Menge an Entitäten zu holen, weil dies völlig unterschiedliche Bestien sind? Volle Unterstützung für Florian's Kommentar. Wenn Sie nichts über Datenbankdesign wissen, dann ist es unmöglich, eine effiziente Hibernate-Nutzung zu verstehen. – Kayaman