我有一個相當複雜的查詢(HQL或Criteria查詢的嵌套級別太多),所以我把它寫成了一個SQLQuery。我真的想使用AliasToBeanResultTransformer將我的結果轉換爲List,但我遇到了一些問題。我已經包含了我現在所掌握的代碼片段。AliasToBeanResultTransformer和Hibernate SQLQuery
當我記錄轉換查詢的結果時,我可以看到轉換器確實創建了一個List,但是每個AdvancedClauseSearchResultDTO中的所有字段都是空的。我認爲這意味着我做錯了別名... AliasToBeanResultTransformer找不到要調用的正確setter。然而,AdvancedClauseSearchResultDTO類確實對我在我的sql字符串中使用別名的每個列都有公共setter。如果這是一個Criteria查詢,我會使用投影來爲每個要返回的列定義一個別名,但我不確定如何使用SQLQuery完成同樣的事情。
有關如何獲取別名的建議,以便ResultTransformer可以使用它們嗎?我見過一些有限的文檔,建議使用'as aliasName'方法應該可行,但它似乎不適合我。
開始查詢字符串定義的片斷,注意 '爲' 別名定義
StringBuffer clauseBaseQuery = new StringBuffer();
clauseBaseQuery.append("select ");
clauseBaseQuery.append(" clauseDetail.clause_detail_id as clauseDetailId,");
clauseBaseQuery.append(" clauseDetail.clause_id as clauseId,");
clauseBaseQuery.append(" providers.provider_name as provider, ");
clauseBaseQuery.append(" products.product_name as product, ");
的SQLQuery創作&設置使用ResultTransformer
Query query = session.createSQLQuery(clauseBaseQuery.toString());
query.setResultTransformer(new AdvancedClauseSearchResultTransformer());
return (List<AdvancedClauseSearchResultDTO>)query.list();
AdvancedClauseSearchResultTransformer類(使用AliasToBeanResultTransformer然後做一些額外的處理):
class AdvancedClauseSearchResultTransformer implements ResultTransformer {
//Use the aliasTransformer to do most of the work
ResultTransformer aliasTransformer = Transformers.aliasToBean(AdvancedClauseSearchResultDTO.class);
@Override
public List transformList(List list) {
log.debug("transforming CLAUSE results");
List<AdvancedClauseSearchResultDTO> result = aliasTransformer.transformList(list);
//for each row, set the status field
for (AdvancedClauseSearchResultDTO dto : result) {
log.debug("dto = " + dto);
String status = null;
Date effectiveDate = dto.getEffectiveDate();
Date terminationDate = dto.getTerminationDate();
Date now = new Date(System.currentTimeMillis());
if (now.before(effectiveDate)) {
status = "Pending";
} else if (now.after(terminationDate)) {
status = "Terminated";
} else {
status = "Active";
}
dto.setStatus(status);
if (StringUtils.isNotEmpty(dto.getReasonForAmendment())){
dto.setAmended(Boolean.TRUE);
}else{
dto.setAmended(Boolean.FALSE);
}
}
return result;
}
@Override
public Object transformTuple(Object[] os, String[] strings) {
Object result = aliasTransformer.transformTuple(os, strings);
return result;
}
}
我確實嘗試過,但它沒有改變任何東西。 – elduff 2010-12-15 03:54:09