私はかなり複雑なクエリ(HQLクエリまたはCriteriaクエリのネストレベルが多すぎます)があるので、SQLQueryとして記述しました。 AliasToBeanResultTransformerを使用して結果をリストに変換したいのですが、いくつか問題があります。私は今、私が得たものの下にコードスニペットを含めました。AliasToBeanResultTransformerとHibernate SQLQuery
変換されたクエリの結果をログに記録すると、トランスフォーマがリストを作成することがわかりますが、各AdvancedClauseSearchResultDTOのすべてのフィールドはnullです。私はそれがAliasToBeanResultTransformerが呼び出したい正しいセッターを見つけることができないという、エイリアシングに何か間違ったことをしていることを意味します。ただし、AdvancedClauseSearchResultDTOクラスには、SQL文字列でエイリアス化した各列のパブリックセッターがあります。これがCriteria問合せの場合は、返す各列の別名を定義するために投影法を使用しますが、SQLQueryを使用して同じことを達成する方法がわかりません。
エイリアスを取得してResultTransformerで使用できるようにする方法についてアドバイスしますか?私は、 'aliasName'メソッドを使用するとうまくいくはずだと示唆している限定されたドキュメントを見たことがありますが、それは私のためではないようです。
エイリアス 'などの' 定義resultTransformer
Query query = session.createSQLQuery(clauseBaseQuery.toString());
query.setResultTransformer(new AdvancedClauseSearchResultTransformer());
return (List<AdvancedClauseSearchResultDTO>)query.list();
AdvancedClauseSearchResultTransformerクラスの
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作成&設定に注意し、クエリ文字列の定義のスニペットの開始(当時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