簡體   English   中英

如何使用休眠條件創建查詢

[英]How do I create my query with Hibernate Criteria

我必須使用條件創建以下查詢:

SELECT r.*,( 
         SELECT COUNT(*) FROM APP.P_FORM_QUESTION_ANSWER qa 
         WHERE qa.J_STATUS = 'CORRECT' 
         AND qa.J_FORM_ID = r.J_FORM_ID AND qa.J_AUTHOR_ID = r.J_AUTHOR_ID 
         AND qa.J_FORM_RESULT_ID = r.J_ROW_ID
       ) as correctCount
FROM APP.P_FORM_RESULT r
WHERE r.J_FORM_ID = '123456'
ORDER BY correctCount DESC;

我嘗試將DetachedCriteria用於額外的列,但看不到如何表示:

"qa.J_FORM_ID = r.J_FORM_ID AND qa.J_AUTHOR_ID = r.J_AUTHOR_ID 
 AND  qa.J_FORM_RESULT_ID = r.J_ROW_ID" 

在DetachedCriteria中,然后將我的DetachedCriteria添加為新列

Criteria criteria =  
    HibernateUtil.getSession().createCriteria(FormResult.class, "formResult");
criteria.add(Restrictions.eq("formResult.formId", formId));

DetachedCriteria correctCount =  
    DetachedCriteria.forClass(QuestionAnswer.class, "questionAnswer");

correctCount.add(
      Restrictions.eq("questionAnswer.status",QuestionAnswerStatus.CORRECT));

// How to retrieve 'formResult' ?
correctCount.add(Restrictions.eq("questionAnswer.formId", "formResult.formId")); 

// How to retrieve 'formResult' ?
correctCount.add(Restrictions.eq("questionAnswer.authorId", "formResult.authorId"));  


 // How to retrieve 'formResult' ?
correctCount.add(
    Restrictions.eq("questionAnswer.formResult.rowId", "formResult.rowId"));
correctCount.setProjection(Projections.rowCount());

// How to add my DetachedCriteria as a new column
criteria.setProjection(Projections.alias(correctCount, "correctCount"));

帶注釋的行是我找不到解決方案的行。

最后,我創建了一個不同的SQL查詢,該查詢提供了相同的結果:

SELECT r.J_ROW_ID, COUNT(DISTINCT qa.J_ROW_ID) as correctCount
FROM APP.P_FORM_RESULT r left join APP.P_FORM_QUESTION_ANSWER qa on qa.J_FORM_ID = r.J_FORM_ID AND qa.J_AUTHOR_ID = r.J_AUTHOR_ID AND qa.J_FORM_RESULT_ID = r.J_ROW_ID AND qa.J_STATUS = 'CORRECT'
WHERE r.J_FORM_ID = '123456'
GROUP BY r.J_ROW_ID
ORDER BY correctCount DESC;

我之所以使用HQL,是因為我無法在Criteria中找到方法:

// HQL Query to retrieve the list of FormResult IDs
StringBuilder hql = new StringBuilder();
hql.append("SELECT r.id");
hql.append(" FROM QuestionAnswer qa RIGHT JOIN qa.formResult as r");
hql.append(" WHERE r.formId = :formId AND (qa.status = :status OR qa.status IS NULL)");
hql.append(" GROUP BY r.id");
hql.append(" ORDER BY COUNT(DISTINCT qa.id) DESC"));

Query query = HibernateUtil.getSession().createQuery(hql.toString());
query.setParameter("formId", formId);
query.setParameter("status", QuestionAnswerStatus.CORRECT);

// Retrieve the list of FormResult objects from the list of IDs previously retrieved
List<Long> result = query.list();
if (result != null && !result.isEmpty()) {
  for (Long resultId : result) {
    formResults.add(getData(FormResult.class, resultId));
  }
}

缺點是我必須從我的HQL查詢檢索到的ID列表中逐個檢索每個FormResult。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM