`

Hibernat Criteria 控制连接方式问题(如:inner join变left outer join)

阅读更多
大家好,第一次发贴,望大家多多指教.

问题背景:
我需要用Criteria或DetachedCriteria查一个到多个表的某几个字段.(因为要只查某几个字段,所以用了Projection,不知有没有其他方法?)
DetachedCriteria criteria = DetachedCriteria.forClass(Company.class);
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Property.forName("companyName"));
projectionList.add(Property.forName("C.cityName"));
projectionList.add(Property.forName("A.areaName"));
criteria.createAlias("city", "C")
        .createAlias("area", "A")
        .setProjection(projectionList);
return getHibernateTemplate().findByCriteria(criteria);

打印出来的sql语句是:
select .... from company C inner join City C1 on C.city_id=C1.city_Id 
inner join area A on C.area_id=A.area_id;


以前没有用projection时可以用下面的代码来达到生成left outer join sql的效果
DetachedCriteria criteria = DetachedCriteria.forClass(Company.class);
criteria.setFetchMode("city", FetchMode.JOIN);
criteria.setFetchMode("area", FetchMode.JOIN);
return getHibernateTemplate().findByCriteria(criteria);


问题:
1. 怎样才能变成用left outer join查询而不用inner join?
2. 这个问题顺便问问,查一个到多个表的某几个字段时,查询结果是Object[],能不能让它返回要查询的那个对象,而只有要查的几个field有值,其他为空?

望大家能指点一二,谢谢




分享到:
评论
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>
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>
这个方法我用了一年了,没发现任何问题!
6 楼 xianyun 2007-08-28  
引用
能不能让它返回要查询的那个对象,而只有要查的几个field有值,其他为空?
你觉得这样还能是一个持久化的与数据库一致的对象吗?所以是不可能的。其实绝大部分情况下返回整个对象并没有你想象的那样糟糕。

引用
createCriteria(String associationPath, String alias, int joinType)
DetachedCriteria中没有加入该方法,除非你改源代码。
5 楼 birdjavaeye 2007-08-28  
smalltiger1984 写道
呀,搞错了,应该加criteria.setProjection(null);这一句才是!

那样楼主的那个setProjection(projectionList)就没用了,变成了第二种方式
4 楼 smalltiger1984 2007-08-28  
呀,搞错了,应该加criteria.setProjection(null);这一句才是!
3 楼 imagineyhj 2007-08-23  
终于有人回复了,谢谢啊 

关于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的方式.
现在项目比较紧,迟点再试了.
2 楼 smalltiger1984 2007-08-22  
第一个问题不太清楚.
第二个问题只要加一句:
criteria.setResultTransformer(Criteria.ROOT_ENTITY);
就行了!
1 楼 imagineyhj 2007-08-18  
顶一下,大家有什么头绪或者意见都可以说一下啊,谢谢

相关推荐

    Hibernate 多表连接分页查询示范项目

    对于多表连接,Criteria API 可以通过 JoinType 类型的 JOIN 方法实现,如 INNER JOIN、LEFT JOIN 等。 **分页查询** 在大数据量的场景下,分页查询是必不可少的,它可以提高用户体验并减少服务器负载。Hibernate ...

    Hibernate criteria基本操作

    Hibernate Criteria 是一种在Java应用程序中使用Hibernate ORM框架执行SQL查询的方式。它提供了一种面向对象的方式来构建查询,使得代码更加可读和易于维护。Criteria API 提供了多种方法来构建复杂的查询,包括添加...

    hibernateCriteria查询

    Hibernate Criteria 查询是一种强大的对象化查询方式,它为开发者提供了一种灵活而直观的方式来构建复杂的查询逻辑。与传统的SQL查询相比,Criteria查询更加面向对象,易于理解和维护。在Hibernate框架中,Criteria...

    Hibernate 内连接和左外连接

    本文主要讨论的是内连接(INNER JOIN)和左外连接(LEFT OUTER JOIN)两种类型,并结合实际例子进行详细讲解。 内连接(INNER JOIN)返回两个表中匹配的行。这意味着只有当第一个表的某行与第二个表的某行有匹配的...

    Hibernate Criteria 排序的問題

    ### Hibernate Criteria 排序问题详解 #### 一、前言 在使用Hibernate进行数据库操作时,经常需要对查询结果进行排序处理。对于简单的查询场景,使用HQL(Hibernate Query Language)即可轻松实现排序功能;但对于...

    Hibernate的Criteria用法总结

    在Java持久层框架Hibernate中,Criteria API是一种动态构建SQL查询的方法,它允许开发者在运行时构建查询,提供了更面向对象的查询方式。本篇将详细阐述Hibernate Criteria API的使用。 首先,Criteria API由...

    Criteria hibernate

    Hibernate Criteria API允许进行关联查询,包括内连接、外连接等。通过addJoin()或createAlias()方法实现。 7. **子查询(Subqueries)** 当需要在查询条件中使用子查询时,Criteria API提供了Subqueries类。可以...

    hibernate criteria 分组 排序 关联

    ### Hibernate Criteria 分组、排序与关联查询详解 #### 标题与描述理解 - **标题**:“hibernate criteria 分组 排序 关联”这一标题明确了本文将围绕Hibernate Criteria API进行分组、排序以及关联查询的具体...

    Hibernate Criteria用法大全.docx

    Hibernate Criteria API 是一种面向对象的查询方式,它提供了一种比HQL(Hibernate Query Language)更为简洁且直观的查询手段。通过Criteria API,开发者可以构建复杂的查询条件,无需直接编写SQL,使得代码更加...

    Hibernate中Criteria的完整用法

    Hibernate中的Criteria API是一种用于执行动态查询的机制,它允许开发者在运行时构建SQL查询,而无需直接编写SQL语句。Criteria API提供了更加面向对象的方式来处理数据库查询,这使得代码更易于理解和维护,尤其是...

    Hibernate Criteria 完全使用

    Hibernate Criteria API 提供了强大的、面向对象的查询方式,使得开发者可以方便地进行复杂的数据库操作,同时避免了SQL注入等安全问题。通过熟练掌握其用法,能够显著提高开发效率,增强代码的可读性和可维护性。 ...

    Hibernate中,利用Criteria查询容器实现sql的写法

    在Java的持久化框架Hibernate中,Criteria API是一种用于构建动态查询的强大工具,它允许开发者以对象化的方式构建SQL语句,而无需直接编写SQL代码。本篇将详细讲解如何在Hibernate中利用Criteria查询来实现类似SQL...

    hibernate criteria的使用方法

    在 Hibernate 中,Criteria API 提供了一种类型安全的方式来构建动态查询,与 HQL 相比,它更加面向对象,并且支持更复杂的查询条件。 #### 二、基本概念 1. **Criteria**:`org.hibernate.Criteria` 接口是 ...

    Hibernate Query Language

    - 支持不同类型的连接:内连接(`inner join`)、左外连接(`left outer join`)、右外连接(`right outer join`)、全连接(`full join`)。 ### 8. `select`子句 - `select`子句用于指定查询结果中包含的对象和...

    day36 04-Hibernate检索方式:多表连接查询

    标题中的“day36 04-Hibernate检索方式:多表连接查询”表明这是一个关于Hibernate框架的教程,重点讲解如何在Hibernate中进行多表连接查询。在这个主题中,我们将深入探讨Hibernate的ORM(对象关系映射)机制以及...

    Hibernate的HQL与Criteria资料

    本资料主要探讨的是Hibernate中的两种查询方式:HQL(Hibernate Query Language)和Criteria API。 HQL,全称为Hibernate查询语言,是Hibernate提供的一种面向对象的查询语言,类似于SQL,但更加面向对象。HQL直接...

    hibernate如何使用criteria联合查询 group by 的语句

    这个案例是根据分组查询,并且得到每组的条数,不懂得可以q我:1710086675,欢迎认识更多新朋友

    Hibernate的Criteria用法总结.doc

    Hibernate 的 Criteria 用法总结 Hibernate 的 Criteria 是一个完全面向对象、可扩展的条件查询 API,通过它完全不需要考虑数据库底层如何实现、SQL 语句如何实现。Criteria 提供了灵活的查询条件组装方式,能够...

    Hibernate Criteria

    NULL 博文链接:https://chenlinbo.iteye.com/blog/335677

Global site tag (gtag.js) - Google Analytics