java – AliasToBeanResultTransformer和Hibernate SQLQuery
我有一个相当复杂的查询(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所建议的那样. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Android常用单位转换的辅助类
- Java JDBC查询在单独的线程锁父级中
- 多个线程顺序打印不同字符abcdefg(利用线程池实现多线程)
- java – Android – 如何避免活动之间重复的代码
- java – 在linux托管服务器上上传和下载文件使用RSync算法
- java – 为什么/ loop循环变量在循环退出后递增1?不必要的
- This template did not produce a Java class or an interf
- 将3D数组写入二进制文件并将文件读回另一个3D数组Java
- java – 具有弹性城堡的椭圆曲线密码学(ECC),用于非对称加密
- postman中 form-data、x-www-form-urlencoded、raw、binary