Hibernate 的 DetachedCriteria 多表查询问题?

xiaojiit 2008-12-03 03:55:52
1,在Hibernate 里,使用DetachedCriteria做为查询语句,怎么写多表查询呢?

比如说一个问题,有多个回复,在回复里有回复人的名称,查出某个人的所有的回复怎么实现呢?

2,这里的多表查询跟表于表之间的映射:一对多,多对一有关系吗?

...全文
1189 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lihan6415151528 2008-12-06
  • 打赏
  • 举报
回复
like查询的话,可以用 filter 或者QBC

如果非要这么用的话
那么
from Arress a where a.user.username like '%?%';
xiaojiit 2008-12-05
  • 打赏
  • 举报
回复
还是没有明白,再问一下!我做出来肯定会结贴的!
一个多对一的关系,比如说User和Address,
比如在Address表里:
<many-to-one name="user" class="com.User"
insert="false" update="false" column="UserID" />

在Address里有个UserID与User的ID关对应,

private User user = new User();

private String username = props.getDEFAULT_EMPTY();


这样进,我可以读出username,怎么做Like查询呢?

当我查询Address表时,想按Like UserName的条件进行查询,怎么做呢?



用Criteria的查询方式,谢谢了!
lihan6415151528 2008-12-04
  • 打赏
  • 举报
回复
呵呵 那倒没有接触过,此贴该结了 嘿嘿
xiaojiit 2008-12-04
  • 打赏
  • 举报
回复
崩溃了!能查出来,怎么用Tapestry 读出来呢?晕了!救命呀!!!
lihan6415151528 2008-12-03
  • 打赏
  • 举报
回复
多看看基础资料比较好
然月枕流君 2008-12-03
  • 打赏
  • 举报
回复
楼上好长的帖子,叹气,今天没什么精神会问题;
本子的系统崩溃了...我可怜的资料啊........
fengyifei11228 2008-12-03
  • 打赏
  • 举报
回复
lazy="false"的解释
Hibernate的检索策略包括类级别检索策略和关联级别检索策略。

类级别检索策略有立即检索和延迟检索,默认的检索策略是立即检索。在Hibernate映射文件中,通过在<class>上配置 lazy属性来确定检索策略。对于Session的检索方式,类级别检索策略仅适用于load方法;也就说,对于get、qurey检索,持久化对象都会被立即加载而不管lazy是false还是true.一般来说,我们检索对象就是要访问它,因此立即检索是通常的选择。由于load方法在检索不到对象时会抛出异常(立即检索的情况下),因此我个人并不建议使用load检索;而由于<class>中的lazy属性还影响到多对一及一对一的检索策略,因此使用load方法就更没必要了。

关联级别检索策略有立即检索、延迟检索和迫切左外连接检索。对于关联级别检索,又可分为一对多和多对多、多对一和一对一两种情况讨论。

一对多和多对多关联关系一般使用<set>配置。<set>有lazy和outer-join属性,它们的不同取值绝对了检索策略。

1)立即检索:这是一对多默认的检索策略,此时lazy=false,outer-join=false.尽管这是默认的检索策略,但如果关联的集合是无用的,那么就不要使用这种检索方式。

2)延迟检索:此时lazy=true,outer-join=false(outer-join=true是无意义的),这是优先考虑的检索方式。

3)迫切左外连接检索:此时 lazy=false,outer-join=true,这种检索策略只适用于依靠id检索方式(load、get),而不适用于query的集合检索(它会采用立即检索策略)。相比于立即检索,这种检索策略减少了一条sql语句,但在Hibernate中,只能有一个<set>配置成 outer-join=true.

多对一和一对一检索策略一般使用<many-to-one>、<one-to-one>配置。<many- to-one>中需要配置的属性是 outer-join,同时还需要配置one端关联的<class>的lazy属性(配置的可不是<many-to-one>中的lazy哦),它们的组合后的检索策略如下:

1) outer-join=auto:这是默认值,如果lazy=true为延迟检索,如果lazy=false为迫切左外连接检索。

2) outer-join=true,无关于lazy,都为迫切左外连接检索。

3) outer-join=false,如果lazy=true为延迟检索,否则为立即检索。

可以看到,在默认的情况下(outer-join=auto,lazy=false),对关联的one端对象Hibernate采用的迫切左外连接检索。依我看,很多情况下,我们并不需要加载one端关联的对象(很可能我们需要的仅仅是关联对象的id);另外,如果关联对象也采用了迫切左外连接检索,就会出现select语句中有多个外连接表,如果个数多的话会影响检索性能,这也是为什么Hibernate通过 hibernate.max_fetch_depth属性来控制外连接的深度。对于迫切左外连接检索,query的集合检索并不适用,它会采用立即检索策略。

对于检索策略,需要根据实际情况进行选择。对于立即检索和延迟检索,它们的优点在于select语句简单(每张表一条语句)、查询速度快,缺点在于关联表时需要多条select语句,增加了访问数据库的频率。因此在选择即检索和延迟检索时,可以考虑使用批量检索策略来减少select语句的数量(配置batch-size属性)。对于切左外连接检索,优点在于select较少,但缺点是select语句的复杂度提高,多表之间的关联会是很耗时的操作。另外,配置文件是死的,但程序是活的,可以根据需要在程序里显示的指定检索策略(可能经常需要在程序中显示指定迫切左外连接检索)。为了清楚检索策略的配置效果如何,可以配置show_sql属性查看程序运行时Hibernate执行的sql语句。
<!-- 以下代码用于配置一对多映射 -->
<set name="reply" inverse="true" cascade="all" lazy="false">
<key>
<!-- 以下代码表示主键是questionId,查询时不能为空 -->
<column name="questionId" not-null="true" />
</key>
<!-- 一对多映射 -->
<one-to-many class="你的reply类" />
</set>


建议楼主该去看看hibernate基础了

questionId当然查询的是Question这个表了
xiaojiit 2008-12-03
  • 打赏
  • 举报
回复
lazy false?是什么意思?
<set name="reply" inverse="true" cascade="all" lazy="false">
<key>
<column name="questionId" not-null="true" />
</key>
<one-to-many class="你的reply类" />
</set>
这里的questionId,是哪个表的?
lihan6415151528 2008-12-03
  • 打赏
  • 举报
回复
复合查询的话,建议用hibernate filter 很好用的

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧