使用hibernate從數據庫填充表時,理想情況下希望使用最少量的查詢,以便快速應用它們。理想情況下,您不希望執行比您正在構建的表中的列更多的查詢,因爲按查詢分組將允許您填充所有行。所以如果你有m列和n行,你只需要執行m個查詢。減少休眠所需的查詢數
但是,我發現很難在沒有寫入新方法的情況下在Daos中實現這一點。比方說,你正在處理名爲Employee實體,並且你想計算的工作時間平均數量,你會再需要2種方法:
public interface EmployeesDao
{
public List<Double> averageOfHoursWorked(List<Integer> ids);
public double averageOfHoursWorked(Integer id);
}
所以,當你想創建一個表,你會使用的方法接受一個列表,但是當你只處理一個單一的員工時,你會使用一個單一的ID。
但我不想寫2個方法,我只想寫一個理想的方法。但是,如果我寫一個方法,我最終使用一個for循環,這使得查詢,而不只是一個的一大堆:
// 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...
}
所以我知道的第二個版本要快得多,但它需要我更長的時間來代碼然後。但正如我在寫這個我想我可以做這樣的事情:
class EmployeesDaoImp implements EmployeesDao {
@Override
public double averageOfHoursWorked(Integer id) {
return averageOfHoursWorked(Arrays.asList(id)).get(0);
}
}
那我就只需要編寫List<Double> averageOfHoursWorked(List<Integer> ids)
,這是個好主意嗎?一般來說,有人會用一種更優雅的方式來製作表格嗎?也許一個生成器模式或某事會更好,如:
Table table = dao.buildTable().withIds(ids).columnId().columnAvgHoursWorked().columnDaysOff()
其中ColumnID的()會給你的ID列,columnAvgHoursWorked,會給你的另一列與工作時間等。使用hibernate製作表格的最佳方式是什麼,需要最少量的查詢和代碼。
我得到你所要求的一般要點,但它仍然不清楚。你能給出一個(可能是簡化版)的數據庫模式,以及它如何轉換爲你正在製作的mxn表?你還可以顯示你用來創建表的代碼片段嗎?但是請注意,通常情況下,您可以使用HQL編寫自定義查詢,因此始終可以使用獨立於dbms的方式創建自己的特定查詢。作爲開始,請參閱https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#hql。 –
我想我會刪除這個問題,我想不出一個沒有更清楚也不太寬泛的方法,我只想盡量減少我寫的代碼的數量,但不會執行太多的數據庫操作。 – Snickers3192
我不能刪除這個問題,請問主持人請關閉這個,或者只是在我的問題上投票結束。 – Snickers3192