gpt4 book ai didi

java - 减少hibernate需要的查询数量

转载 作者:行者123 更新时间:2023-12-01 06:22:52 26 4
gpt4 key购买 nike

当使用 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) , 这是一个好主意吗?有人有更优雅的方式用 hibernate 来制作表格吗?也许构建器模式或其他东西会更好,例如:

Table table = dao.buildTable().withIds(ids).columnId().columnAvgHoursWorked().columnDaysOff()

其中,columnId() 将为您提供一列 ids,columnAvgHoursWorked 将为您提供另一列,其中包含工作时间等。使用 hibernate 制作表的最佳方式是什么,需要最少的查询和代码。

最佳答案

首先,抱歉我的英语不好。我认为可以创建一个 DTO 对象,该对象将作为数据对象并包含要在 JSP 中使用的所有信息,您将这些对象作为一种独特方法的返回,并在一次独特的调用中解决您的问题。

例如:


公共(public)列表 getAllEmployeesWithAverageHoursWorked(int start, int finish){



List
    
      结果 = new ArrayList
     
      ();
      
///执行查询,加载在参数start中开始并在参数finish中结束的寄存器

返回结果;

}

类 EmployeeDTO 将包含您需要在 JSP 页面中使用的所有字段,或者,如果此选项不能解决此问题,您将更改方法和类 EmployeeDTO 以包含您需要的字段。

关于java - 减少hibernate需要的查询数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39969161/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com