使用Hibernate进行复杂查询的问题

时间:2012-01-12 01:07:41

标签: hibernate grails groovy

我有7个汇总表,每周一天。 txn_summary_monday ... txn_summary_tuesday等等......

表存储事务计算每个日期(每个星期一,每个星期二......等等),位置,用户,资源等。

这是表格的示例域

class TxnSummFri {
    Long id 
    Transaction trans
    Users guser
    Resources gresource
    Integer txnCount
    Date currentdate 
    String accountid

    }

我需要按日期范围内的位置获取总计数...(因此它将是每个表上按位置计算的所有单个表计数的总和,然后再按所有表的位置计算该计数的总和)。

还有一件事是我必须在汇总表上进行左连接而不是内部连接,因为我想要最终列表中7个表中的所有可能位置。 (某些表可能缺少某些位置)。

如何在hibernate中编写上述查询...我在应用程序中将摘要表作为域对象。 该应用程序基于grails / groovy。

以下是我到目前为止所写的内容...现在按每个表格的位置计算,按位置对这些内容求和。

def SummTblList  = ['TxnSummMon','TxnSummTue','TxnSummWed','TxnSummThu','TxnSummFri','TxnSummSat','TxnSummSun']
def res_row
def resourceInstance=Resources.get(Long.parseLong(res_id))
         SummTblList.each{
         res_row=it.createCriteria().get {   

            eq('resource',resourceInstance)
            between('date', new Date()-31, new Date())        

            projections {  
            sum('actioncount')
            groupProperty 'location'         
                }                  
            }    

关于架构要求的事情(与上述无关): 基本上我对用户事务表有各种查询...用于事务,用户,资源,按日期,按用户,按资源,位置的聚合。我使用fusioncharts(基于闪存的工具,使用jasper报告和一般UI搜索运行报告)来运行图表。

我们之前使用的是单个表,但是为过去7天的用户活动生成报告,4个资源中的4个需要60秒...我想让它最少20倍。

提前致谢,

Priyank

1 个答案:

答案 0 :(得分:0)

我会将数据库更改为具有单个事务表而不是一周中每天的表。这将大大简化查询。

如果我没有能力更改数据库,我会向数据库管理员提出一个令人信服的论据,说明为什么我们应该将数据库更改为只有一个事务表。

如果我的令人信服的论点被否定,我会做一些激烈的事情(不一定按此顺序):

  • 看看你是否可以创建一个以某种方式组合所有表的视图,并且GORM映射视图
  • 查看使用高级GORM / Hibernate功能(如基类)是否可以简化查询
  • 分解并尝试创建HQL查询以从每个表中选择这些值
  • 如果创建HQL查询会导致问题,请查看本机查询是否更简单