如何使用Hibernate查询索引的MySQL数据库

时间:2013-08-15 20:40:18

标签: java mysql hibernate dao indexing

我有一个基于MySQL开发的应用程序,它通过Hibernate连接。我使用DAO实用程序代码来查询数据库。现在我需要通过索引优化我的数据库查询。我的问题是,如何通过Hibernate DAO实用程序代码查询数据,并确保在执行查询时在MySQL数据库中使用索引。任何有关现有示例的提示或指示都表示赞赏!

更新:只是想让问题更容易理解。以下是我用于通过Hibernated DAO实用程序代码查询MySQL数据库的代码。我不是在这里直接使用HQL。有关最佳解决方案的建议吗?如果需要,我将重写数据库查询代码并直接使用HQL。

    public static List<Measurements> getMeasurementsList(String physicalId, String startdate, String enddate) {

    List<Measurements> listOfMeasurements = new ArrayList<Measurements>();
    Timestamp queryStartDate = toTimestamp(startdate);
    Timestamp queryEndDate = toTimestamp(enddate);

    MeasurementsDAO measurementsDAO = new MeasurementsDAO();
    PhysicalLocationDAO physicalLocationDAO = new PhysicalLocationDAO();
    short id = Short.parseShort(physicalId);
    List physicalLocationList = physicalLocationDAO.findByProperty("physicalId", id);
    Iterator ite = physicalLocationList.iterator();
    while(ite.hasNext()) {
        PhysicalLocation physicalLocation = (PhysicalLocation)ite.next();
        List measurementsList = measurementsDAO.findByProperty("physicalLocation", physicalLocation);
        Iterator jte = measurementsList.iterator();
        while(jte.hasNext()){
            Measurements measurements = (Measurements)jte.next();
            if(measurements.getMeasTstime().after(queryStartDate) 
                    && measurements.getMeasTstime().before(queryEndDate)) {
                listOfMeasurements.add(measurements);
            }
        }
    }

    return listOfMeasurements;
}

1 个答案:

答案 0 :(得分:1)

就像使用SQL一样,您不需要做任何特别的事情。只需像往常一样执行查询,如果可能,数据库将使用您创建的索引来优化它们。

例如,假设您有一个HQL查询,它会搜索具有给定名称的所有产品:

select p from Product where p.name = :name

此查询将由Hibernate转换为SQL:

select p.id, p.name, p.price, p.code from product p where p.name = ?

如果您在product.name上没有设置任何索引,则数据库必须扫描整个产品表以查找具有给定名称的索引。

如果您在product.name上设置了索引,则数据库将确定在给定查询的情况下使用此索引很有用,因此可以通过索引知道哪些行具有给定名称。因此,它只能读取行的一小部分以返回查询数据。

这对你来说都是透明的。您只需要知道哪些查询的速度很慢且频繁,足以证明创建索引以加快它们的速度。