2016-10-11 3 views
1

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?

+0

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. –

+0

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

+0

Ich kann diese Frage nicht löschen, kann ein Moderator das bitte schließen, oder einfach nur kurz auf meine Frage abstimmen. – Snickers3192

Antwort

-1

Zuerst, sorry für mein schlechtes Englisch. Ich denke, dass es möglich ist, ein DTO-Objekt zu erstellen, das das Datenobjekt sein wird und alle Informationen enthält, die in Ihrer JSP verwendet werden. Sie werden diese Objekte als Rückgabe einer eindeutigen Methode zurückgeben und in einem einzigen Aufruf Ihr Problem lösen.

zum Beispiel:

public List getAllEmployeesWithAverageHoursWorked(int start, int finish){

List<EmployeeDTO> result = new ArrayList<EmployeeDTO>(); 
///execute query that load registers that start in parameter start and finishes in parameter finish 

return result; 

}

Die Klasse EmployeeDTO werden alle Felder, die Sie benötigen in Ihrer JSP-Seite verwenden, oder wenn diese Option nicht, diese Frage lösen, wird sich ändern Sie die Methode und die Klasse EmployeeDTO, um die benötigten Felder zu haben.

+0

Die Frage ist, wie ich es vermeide, deine Antwort zu machen. Ich möchte nicht jedes Mal eine benutzerdefinierte Dao-Methode schreiben müssen, wenn ich einen Tisch mache. Ich möchte nur das wiederverwenden, was ich habe. Aber ich möchte auch nicht 100 Datenbankanrufe machen, wenn ich nicht muss. Aber wenn ich wiederverwende, was ich habe, endet es damit. – Snickers3192

-1

Ich verstehe nicht sehr weel Ihre Frage, aber ich werde drei Formen geben, und ich denke, dass man helfen kann.

1 - Verwenden Sie Generika und verwenden Sie das gleiche DAO für alle Arten von Objekten, die Sie in Ihrer Software haben.

2 - In meiner Antwort ist es möglich, die Start- und Zielpunkte anzugeben, die Sie lesen müssen, zum Beispiel: Sie haben 10 Datensätze gelesen und müssen jetzt mehr als lesen, dann übergeben Sie 10 und 20 und lesen mehr 10.

3 - im ersten Aufruf werden Sie die Datensätze, die Sie benötigen, in eine statische Variable und verwenden (es ist schrecklich).

Wenn Ihr Problem nicht "schreiben" Code ist, verwenden Sie Generika, es ist sehr gut, dieses Problem zu lösen.

Aber wenn meine Antwort nicht korrekt ist, schreibe bitte deine Frage noch einmal, aber mit anderen Worten, damit ich dir helfen kann.

0

ich jetzt glaube ich, Ihr Problem zu verstehen, siehe die folgende Option:

public abstract class GenericDAOImpl<T> implements GenericDAO<T>{ 

     private Class<T> entityBeanType; 

     @Autowired 
     protected SessionFactory sessionFactory; 

     public GenericDAOImpl() { 

      ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass(); 
      Type type = genericSuperclass.getActualTypeArguments()[0]; 

      @SuppressWarnings("unchecked") 
      Class<T> clazz = (Class<T>) type; 

      this.entityBeanType = clazz; 
     } 

     @SuppressWarnings("unchecked") 
     public T save(T t) { 
      T t1 = (T) sessionFactory.getCurrentSession().merge(t); 
      sessionFactory.getCurrentSession().flush(); 
      return t1; 
     } 
    } 

</code> 

Repair that if you need to create another table, you will can extend this class to create a concrete DAO.

Example:

1 - create a table User and use the following code:

public class UserDAOImpl extends GenericDAOImpl<User> implements UserDAO{ 
    ///other specific methods will be here 
} 

2 - eine Tabelle Quittungen erstellen und den folgenden Code verwenden:

public class ReceiptsDAOImpl extends GenericDAOImpl<Receipts> implements  ReceiptsDAO{ 
    ///other specific methods will be here 
} 

die generische Typ T kann eine Entität Ihrer Software sein.

Ich hoffe, dass meine Antwort Ihnen helfen kann.

+1

Bitte hören Sie auf, viele Antworten zu posten, formatieren Sie Ihre Antworten, versuchen Sie, nur eine Antwort zu haben, wenn Sie können. Du füllst diesen Beitrag mit Mist. – Snickers3192

Verwandte Themen