java – AliasToBeanResultTransformer和Hibernate SQLQuery
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – AliasToBeanResultTransformer和Hibernate SQLQuery,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3521字,纯文字阅读大概需要6分钟。
内容图文
![java – AliasToBeanResultTransformer和Hibernate SQLQuery](/upload/InfoBanner/zyjiaocheng/901/2c094485ad7e400b9a43baad16b9fc43.jpg)
我有一个相当复杂的查询(HQL或Criteria查询的嵌套级别太多),因此我将其编写为SQLQuery.我真的想使用AliasToBeanResultTransformer将我的结果转换为List,但是我遇到了一些问题.我已经将代码片段包含在我现在所拥有的代码片段之下.
当我记录转换后的查询的结果时,我可以看到转换器确实创建了一个List,但是,每个AdvancedClauseSearchResultDTO中的所有字段都是null.我认为这意味着我在使用别名做错了… AliasToBeanResultTransformer无法找到要调用的正确setter.但是,AdvancedClauseSearchResultDTO类确实为我在sql字符串中别名的每个列都有公共setter.如果这是一个Criteria查询,我会使用projection为每个要返回的列定义一个别名,但我不确定如何使用SQLQuery完成同样的事情.
有关如何设置别名的建议,以便ResultTransformer可以使用它们吗?我已经看到一些有限的文档表明使用’as aliasName’方法应该有效,但它似乎不适合我.
查询字符串定义的开头片段,请注意’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;
}
}
解决方法:
这取决于您使用的后端,您在帖子中没有提到.
除非您正确地转义它们,否则各种数据库后端会对列使用不区分大小写的命名,因此它们最终将被检索为CLAUSEDETAILID或clausedetailid,即使您使用正确的大小写指定列结果名称也是如此.
使用PostgreSQL(我也相信Oracle),你必须像这样编写你的查询(注意列引用):
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\", ");
Query query = session.createSQLQuery(clauseBaseQuery.toString());
这样就可以让Hibernate正确识别属性并将结果映射到bean,前提是你还指定了转换:
query.setResultTransformer(Transformers.aliasToBean(AdvancedClauseSearchResultDTO.class));
正如@ zinan.yumak所建议的那样.
内容总结
以上是互联网集市为您收集整理的java – AliasToBeanResultTransformer和Hibernate SQLQuery全部内容,希望文章能够帮你解决java – AliasToBeanResultTransformer和Hibernate SQLQuery所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。