AliasToBeanResultTransformer和Hibernate SQLQuery

elduff:

我有一个相当复杂的查询(HQL或Criteria查询的嵌套级别太多),因此我将其编写为SQLQuery。我真的很想使用AliasToBeanResultTransformer将我的结果转换为List,但是我遇到了一些问题。我在下面介绍了一些代码片段。

当我记录转换查询的结果时,我可以看到转换器确实创建了一个列表,但是,每个AdvancedClauseSearchResultDTO中的所有字段均为空。我认为这意味着我在别名方面做错了... AliasToBeanResultTransformer无法找到要调用的正确的setter。但是,AdvancedClauseSearchResultDTO类确实为我在sql字符串中别名的每个列都有公共设置器。如果这是一个Criteria查询,我将使用投影为要返回的每一列定义一个别名,但是我不确定如何使用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;
        }
    }
elduff:

我今天对此进行了更多研究,最后注意到我得到了很多潜在错误的堆栈跟踪信息,以及一个休眠的论坛条目帮助我克服了这个问题。

我得到的异常是:原因:org.hibernate.PropertyNotFoundException:找不到CLAUSEDETAILID的设置方法

似乎Hibernate正在使用我的驼峰式别名并将其全部变为大写,因此在AdvancedClauseSearchResultDTO类中找不到匹配的设置器。

这是向我指出正确方向的论坛条目:

https://forum.hibernate.org/viewtopic.php?f=1&t=1001608

我最终对我自己的ResultTransformer使用了该帖子中详细介绍的方法,并且对我有用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章