Wenn Sie eine Tabelle aus einer Datenbank mit Hibernate auffüllen, sollte idealerweise die geringste Anzahl an Abfragen verwendet werden, damit die Anwendung schnell ausgeführt werden kann. Im Idealfall würden Sie nicht mehr Abfragen ausführen wollen als Spalten in der zu erstellenden Tabelle, da eine Gruppe nach Abfrage das Auffüllen aller Zeilen ermöglichen würde. Wenn Sie also m Spalten und n Zeilen haben, würden Sie nur m Abfragen durchführen wollen.Verringern Sie die Anzahl der vom Ruhezustand benötigten Abfragen.
Allerdings finde ich es schwer, dies innerhalb meiner Daos zu erreichen, ohne neue Methoden zu schreiben. Angenommen, Sie haben mit einer Entität namens Mitarbeiter zu tun hatten, und wollten Sie durchschnittliche Zahl der geleisteten Arbeitsstunden berechnen, würden Sie dann müssen zwei Methoden:
public interface EmployeesDao
{
public List<Double> averageOfHoursWorked(List<Integer> ids);
public double averageOfHoursWorked(Integer id);
}
Also, wenn Sie eine Tabelle erstellen möchten, müssen Sie die Methode verwenden eine Liste zu akzeptieren, aber wenn Sie nur mit einem einzelnen Angestellten zu tun haben, würden Sie den verwenden, der eine einzelne ID nimmt.
Aber ich möchte nicht 2 Methoden schreiben, ich möchte nur eine ideal schreiben. Aber wenn ich eine Methode schreiben, habe ich am Ende for-Schleife eine bis die eine ganze Reihe von Anfragen macht, anstatt nur eins:
// THIS IS BAD, creates many queries
List<Integer> ids = Arrays.asList(1,3,5,99, 1921);
for (Integer id : ids) {
double avg = dao.averageOfHoursWorked(id);
// .... doing some table stuff with avg...
}
// THIS IS GOOD, only 1 query, yet now I must write more code):
List<Double> avgs = dao.averageOfHoursWorked(ids);
for (Double avg : avgs) {
// .... doing some table stuff with avg...
}
Ich weiß also, die zweite Version ist viel schneller, aber es nimmt mich mehr Code dann. Aber wie ich dies schreibe ich dachte, ich etwas tun könnte:
class EmployeesDaoImp implements EmployeesDao {
@Override
public double averageOfHoursWorked(Integer id) {
return averageOfHoursWorked(Arrays.asList(id)).get(0);
}
}
Dann würde ich nur List<Double> averageOfHoursWorked(List<Integer> ids)
zu schreiben, ist dies eine gute Idee? Hat jemand eine elegantere Art, Tische generell mit Ruhe zu versehen? Vielleicht wäre ein Erbauer oder etwas schöner aussehen:
Table table = dao.buildTable().withIds(ids).columnId().columnAvgHoursWorked().columnDaysOff()
wo columnid() eine Spalte von ids geben würde, columnAvgHoursWorked, Sie würde eine weitere Spalte mit der geleisteten Arbeitsstunden und so weiter. Was ist die optimale Art, Tabellen mit Ruhezustand zu erstellen, die die geringste Menge an Abfragen und Code erfordern?
Ich bekomme den allgemeinen Kern dessen, was Sie fragen, aber es ist immer noch irgendwie unklar. Können Sie eine (möglicherweise vereinfachte) Version Ihres Datenbankschemas angeben und wie es in die mxn-Tabellen übersetzt wird, die Sie erstellen? Können Sie auch einen Ausschnitt des Codes anzeigen, den Sie zum Erstellen der Tabelle verwenden? Beachten Sie jedoch, dass Sie im Allgemeinen benutzerdefinierte Abfragen mit HQL schreiben können, so dass Sie immer die Möglichkeit haben, eigene spezifische Abfragen in einer dbms-unabhängigen Weise zu erstellen. Siehe https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#hql als Start. –
Ich denke, ich werde diese Frage löschen, ich kann mir keinen Weg vorstellen, sie zu formulieren, ohne klarer und nicht zu breit zu sein. Ich möchte nur die Menge an Code minimieren, die ich schreibe, aber nicht zu viele Datenbankoperationen durchführen. – Snickers3192
Ich kann diese Frage nicht löschen, kann ein Moderator das bitte schließen, oder einfach nur kurz auf meine Frage abstimmen. – Snickers3192