2013-10-11 107 views
0

我想用指標分析使用Hibernate的標準

select A.evaluated_employee_id, A.created_date, A.total_grade 
from employee_performance_assessment A 
join 
( select evaluated_employee_id, max(created_date) as maxdate, status, total_grade 
    from employee_performance_assessment 
    group by evaluated_employee_id 
) B on A.evaluated_employee_id = B.evaluated_employee_id and A.created_date = B.maxDate 

得到這個SQL我做了以下

DetachedCriteria dc = DetachedCriteria.forClass(EmployeePerformanceAssessmentBO.class); 
    dc.createAlias("evaluatedEmployee", "e"); 
    dc.setProjection(Projections.projectionList().add(Projections.max("createdDate")) 
.add(Projections.groupProperty("evaluatedEmployee"))); 
dc.addOrder(Order.asc("e.lastName")).addOrder(Order.asc("createdDate"));     
    dc.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); 
    return getDAOHibernateTemplate().findByCriteria(dc); 

選擇組最後一個記錄但這產生內部的子查詢的WHERE子句 任何想法如何加入同一個表(類)中的兩個標準?

+0

HQL查詢的from子句不支持子查詢。 Criteria只支持HQL的一個子集。 –

+0

感謝您的評論,所以解決方案將執行本機SQL? – user2869195

+0

是的。你需要SQL來進行這樣的子查詢。 –

回答

4

獲得解決方案。基本上是改變了原有的查詢:

select A.evaluated_employee_id, A.created_date, A.total_grade 
from employee_performance_assessment A 
where A.created_date = 
( select max(created_date) 
    from employee_performance_assessment 
    where A.evaluated_employee_id = evaluated_employee_id 
    group by evaluated_employee_id 
) 

因此而不是加入到我的子查詢where子句中比較CREATED_DATE。 等效於休眠:

DetachedCriteria dc = DetachedCriteria.forClass(EmployeePerformanceAssessmentBO.class, "performanceAssessment"); 
dc.createAlias("evaluatedEmployee", "e"); 

dc.addOrder(Order.asc("e.lastName")).addOrder(Order.asc("createdDate")); 

if (assessmentsSearch.isOnlyLastAssessment()){ 
    DetachedCriteria dc2 = DetachedCriteria.forClass(EmployeePerformanceAssessmentBO.class, "performanceAssessmentSubQuery"); 
    dc2.setProjection(Projections.projectionList().add(Projections.max("createdDate"))); 
    dc2.add(Expression.eqProperty("performanceAssessment.evaluatedEmployee.id", "performanceAssessmentSubQuery.evaluatedEmployee.id")); 

    dc.add(Subqueries.propertyEq("createdDate", dc2)); 
} 

希望它可以幫助別人。