Hibernat Criteria 控制连接方式问题(如:inner join变left outer join)大家好,第一次发贴,望大家多多指教.
Hibernat Criteria 控制连接方式问题(如:inner join变left outer join)
大家好,第一次发贴,望大家多多指教.
问题背景:
我需要用Criteria或DetachedCriteria查一个到多个表的某几个字段.(因为要只查某几个字段,所以用了Projection,不知有没有其他方法?)
关于criteria.setResultTransformer(Criteria.ROOT_ENTITY);
我也试过,但返回的结果还是一个Object[],
我还试了其余的几个,除了Criteria.ALIAS_TO_ENTITY_MAP返回一个空的map外,
其他都是返回Object[], 而且也没报错.
关于第一个问题,刚才看了Hibernate3.1.3的doc,发现新加了个
createCriteria(String associationPath, String alias, int joinType)
的接口,多了个joinType的参数,我想应该可以通过设为Criteria.LEFT_JOIN来达到控制join的方式.
现在项目比较紧,迟点再试了. 4 楼 smalltiger1984 2007-08-28 呀,搞错了,应该加criteria.setProjection(null);这一句才是! 5 楼 birdjavaeye 2007-08-28 smalltiger1984 写道呀,搞错了,应该加criteria.setProjection(null);这一句才是!
那样楼主的那个setProjection(projectionList)就没用了,变成了第二种方式 6 楼 xianyun 2007-08-28 引用能不能让它返回要查询的那个对象,而只有要查的几个field有值,其他为空?你觉得这样还能是一个持久化的与数据库一致的对象吗?所以是不可能的。其实绝大部分情况下返回整个对象并没有你想象的那样糟糕。
引用createCriteria(String associationPath, String alias, int joinType) DetachedCriteria中没有加入该方法,除非你改源代码。 7 楼 smalltiger1984 2007-08-30 <div class='code_title'>java 代码</div>
<div class='dp-highlighter'>
<div class='bar'/>
<ol class='dp-j'>
<li class='alt'><span><span class='comment'>/** </span>?</span></li>
<li class=''><span><span class='comment'>?????*?detachedCriteria:使用DetachedCriteria构造查询条件 </span>?</span></li>
<li class='alt'><span><span class='comment'>?????*?pageSize:每一页需要显示的记录数 </span>?</span></li>
<li class=''><span><span class='comment'>?????*?startIndex:每一页记录的起始数 </span>?</span></li>
<li class='alt'><span><span class='comment'>?????*?return?ps:PaginationSupport对分页数据进行处理 </span>?</span></li>
<li class=''><span><span class='comment'>?????*/</span><span>??</span></span></li>
<li class='alt'><span>????</span><span class='keyword'>public</span><span>?PaginationSupport?findPageByCriteria(</span><span class='keyword'>final</span><span>?DetachedCriteria?detachedCriteria,?</span><span class='keyword'>final</span><span>?</span><span class='keyword'>int</span><span>?pageSize,</span><span class='keyword'>final</span><span>?</span><span class='keyword'>int</span><span>?startIndex)?{ ??</span></li>
<li class=''><span>????????</span><span class='keyword'>return</span><span>?(PaginationSupport)?getHibernateTemplate().execute(</span><span class='keyword'>new</span><span>?HibernateCallback()?{ ??</span></li>
<li class='alt'><span>????????????</span><span class='keyword'>public</span><span>?Object?doInHibernate(Session?session)?</span><span class='keyword'>throws</span><span>?HibernateException?{??? ??</span></li>
<li class=''><span>????????????????Criteria?criteria?=?detachedCriteria.getExecutableCriteria(session);??? ??</span></li>
<li class='alt'><span>????????????????</span><span class='keyword'>int</span><span>?totalCount?=?((Integer)?criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();??? ??</span></li>
<li class=''><span>????????????????criteria.setProjection(</span><span class='keyword'>null</span><span>); ??</span></li>
<li class='alt'><span>????????????????criteria.setResultTransformer(Criteria.ROOT_ENTITY); ??</span></li>
<li class=''><span>????????????????List?items?=?criteria.setFirstResult(startIndex).setMaxResults(pageSize).list(); ??</span></li>
<li class='alt'><span>????????????????PaginationSupport?ps?=?</span><span class='keyword'>new</span><span>?PaginationSupport(items,?totalCount,?pageSize,?startIndex);??? ??</span></li>
<li class=''><span>????????????????</span><span class='keyword'>return</span><span>?ps; ??</span></li>
<li class='alt'><span>????????????} ??</span></li>
<li class=''><span>????????},?</span><span class='keyword'>true</span><span>); ??</span></li>
<li class='alt'><span>????}??</span></li>
</ol>
</div>
这个方法我用了一年了,没发现任何问题! 8 楼 smalltiger1984 2007-08-30 <div class='code_title'><font>?<br/>
c.setProjection(null); 目的是为了获得行数,并设置投影为空,为的是返回List出来,如果不设置setProjection(null)的话,c.list将返回的是行数(int型),而不是所要查询的数据库信息。但是Criteria的ResultTransformer会变成PassThroughResultTransformer,criteria.list的时候可能结果会跟理想的不一样。所以我们还要再c.setResultTransformer(Criteria.ROOT_ENTITY);把结果以Entity的形式返回,而不是Object[]的形式返回。具体的ResultTransformer可以google一下。????</font></div>