【发布时间】:2010-12-14 06:15:02
【问题描述】:
我有一个相当复杂的查询(HQL 或 Criteria 查询的嵌套级别太多),所以我将其编写为 SQLQuery。我真的很想使用 AliasToBeanResultTransformer 将我的结果转换为列表,但我遇到了一些问题。我已经在我现在所拥有的下面包含了代码 sn-ps。
当我记录转换后查询的结果时,我可以看到转换器确实创建了一个列表,但是,每个 AdvancedClauseSearchResultDTO 中的所有字段都是空的。我认为这意味着我在别名方面做错了...... AliasToBeanResultTransformer 找不到要调用的正确设置器。但是,AdvancedClauseSearchResultDTO 类确实为我在我的 sql 字符串中使用别名的每个列提供了公共设置器。如果这是一个 Criteria 查询,我会使用投影来为要返回的每一列定义一个别名,但我不确定如何使用 SQLQuery 完成同样的事情。
关于如何设置别名以便 ResultTransformer 可以使用它们的任何建议?我看到一些有限的文档表明使用 'as aliasName' 方法应该可以工作,但它似乎不适合我。
从查询字符串定义的 sn-p 开始,注意 'as' 别名定义
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;
}
}
【问题讨论】: