Hibernate之FetchMode.Join查询
来源:互联网 发布:编程基础教学 编辑:程序博客网 时间:2024/05/16 13:59
关于setFetchMode:
FetchMode是让两个表建立连接,仅此而已。
例如:一个Emp只能属于一个dept,而一个dept中可以有好多Emp,
这时在Emp中就有一个dept对象
public class Emp{
.......
private dept d;
get()方法
set()方法
......
}
那么如果我想取出emp的时候顺便把它的dept相关的东西给取出来,此时我就需要setFetchMode("dept",FetchMode.JOIN),这样,我就可以正好把相关的dept里面的数据也取出来了,如果打印数据库执行语句,此时是生成的左连接,
但是注意:setFetchMode:仅仅能取出dept的数据,setFetchMode不能完成查询功能。如果查询条件里面有dept里面的东西,那setFetchMode就完不成相应的查询,如果想完成查询,你就需要用createAlias了
关于CreateAlias:
主要是用于查询的时候建立别名,所谓的"别名",自己认为就是另外起了一个名字,但是也不是这么简单。例如,我想查询所有dept的deptName是"人力资源部"的emp
那么我就应该用c.createAlias("dept","dept").add(Restrictions.eq("dept.deptName","人力资源部"));
这里就能完成上面的查询,其实createAlias也是做的left join
那么,也就是说:
setFetchMode可以建立两个表之间的连接,他建立连接的主要目的是为了取出相应的数据,
但是不能只用setFetchMode进行查询。例如,我们有:
c.setFetchMode("dept",FetchMode.JOIN);
c.add(Restrictions.eq("dept.deptName","人力资源部"));
如果只是这两句话的话,肯定有错误的。
而createAlias主要是用于查询,建立两表之间的关系,查询与两个表相关的数据。
那么上面的查询这样写就可以了:
c.setFetchMode("dept",FetchMode.JOIN);
c.createAlias("dept","dept").add(Restrictions.eq("dept.deptName","人力资源部"));
这样就可以既找出dept为“人力资源部”的人,又把与他相关的员工给找出来了。
缺点:setFetchMode和createAlias都会让数据库中的表与其他的表join起来,那么肯定查询的效率就低了。
还有,程序在查询的时候到底是外连接还是内连接我认为还是与你xml里面的配置是有关的。例如:你在emp的xml里面配置与dept之间的关系是多对一关系,并且在数据库里面配置了外键关联,那么无论你setFetchMode设置为什么,这里emp与dept进行关联的时候都会是inner join。绝对不会是外连接,这样写的原因我认为应该是与外键的关联有关吧,由于外键的关系,emp的dept必须在dept中,所以才会使用内连接
FetchMode是让两个表建立连接,仅此而已。
例如:一个Emp只能属于一个dept,而一个dept中可以有好多Emp,
这时在Emp中就有一个dept对象
public class Emp{
.......
private dept d;
get()方法
set()方法
......
}
那么如果我想取出emp的时候顺便把它的dept相关的东西给取出来,此时我就需要setFetchMode("dept",FetchMode.JOIN),这样,我就可以正好把相关的dept里面的数据也取出来了,如果打印数据库执行语句,此时是生成的左连接,
但是注意:setFetchMode:仅仅能取出dept的数据,setFetchMode不能完成查询功能。如果查询条件里面有dept里面的东西,那setFetchMode就完不成相应的查询,如果想完成查询,你就需要用createAlias了
关于CreateAlias:
主要是用于查询的时候建立别名,所谓的"别名",自己认为就是另外起了一个名字,但是也不是这么简单。例如,我想查询所有dept的deptName是"人力资源部"的emp
那么我就应该用c.createAlias("dept","dept").add(Restrictions.eq("dept.deptName","人力资源部"));
这里就能完成上面的查询,其实createAlias也是做的left join
那么,也就是说:
setFetchMode可以建立两个表之间的连接,他建立连接的主要目的是为了取出相应的数据,
但是不能只用setFetchMode进行查询。例如,我们有:
c.setFetchMode("dept",FetchMode.JOIN);
c.add(Restrictions.eq("dept.deptName","人力资源部"));
如果只是这两句话的话,肯定有错误的。
而createAlias主要是用于查询,建立两表之间的关系,查询与两个表相关的数据。
那么上面的查询这样写就可以了:
c.setFetchMode("dept",FetchMode.JOIN);
c.createAlias("dept","dept").add(Restrictions.eq("dept.deptName","人力资源部"));
这样就可以既找出dept为“人力资源部”的人,又把与他相关的员工给找出来了。
缺点:setFetchMode和createAlias都会让数据库中的表与其他的表join起来,那么肯定查询的效率就低了。
还有,程序在查询的时候到底是外连接还是内连接我认为还是与你xml里面的配置是有关的。例如:你在emp的xml里面配置与dept之间的关系是多对一关系,并且在数据库里面配置了外键关联,那么无论你setFetchMode设置为什么,这里emp与dept进行关联的时候都会是inner join。绝对不会是外连接,这样写的原因我认为应该是与外键的关联有关吧,由于外键的关系,emp的dept必须在dept中,所以才会使用内连接
@Override
public QueryResult findCommList(Map commParams, int firstresult,
int maxresult) throws Exception {
DetachedCriteria dec = DetachedCriteria.forClass(JfRlWaresComment.class);
if(commParams!=null&&!commParams.isEmpty()){
dec.createAlias("jfWares", "jfWares");
dec.createAlias("jfComment", "jfComment");
// 商品编号
if (!SysUtil.isNull(commParams.get("number"))) {
dec.add(Restrictions.eq("jfWares.number", commParams.get("number")));
}
//商品名称
if (!SysUtil.isNull(commParams.get("name"))) {
dec.add(Restrictions.like("jfWares.name", String.valueOf(commParams.get("name")),MatchMode.ANYWHERE));
}
//评论内容
if (!SysUtil.isNull(commParams.get("content"))) {
dec.add(Restrictions.like("jfComment.content", String.valueOf(commParams.get("content")),MatchMode.ANYWHERE));
}
//大于等于开始时间
if (!SysUtil.isNull(commParams.get("startt"))) {
dec.add(Restrictions.ge("createTime", commParams.get("startt")));
}
//小于等于结束时间
if (!SysUtil.isNull(commParams.get("endt"))) {
dec.add(Restrictions.le("createTime", commParams.get("endt")));
}
//默认排序
dec.addOrder(Order.desc("createTime"));
//dec.addOrder(Order.desc("jfWares.number"));
}
return super.getScrollData(firstresult, maxresult, dec);
}
public QueryResult findCommList(Map commParams, int firstresult,
int maxresult) throws Exception {
DetachedCriteria dec = DetachedCriteria.forClass(JfRlWaresComment.class);
if(commParams!=null&&!commParams.isEmpty()){
dec.createAlias("jfWares", "jfWares");
dec.createAlias("jfComment", "jfComment");
// 商品编号
if (!SysUtil.isNull(commParams.get("number"))) {
dec.add(Restrictions.eq("jfWares.number", commParams.get("number")));
}
//商品名称
if (!SysUtil.isNull(commParams.get("name"))) {
dec.add(Restrictions.like("jfWares.name", String.valueOf(commParams.get("name")),MatchMode.ANYWHERE));
}
//评论内容
if (!SysUtil.isNull(commParams.get("content"))) {
dec.add(Restrictions.like("jfComment.content", String.valueOf(commParams.get("content")),MatchMode.ANYWHERE));
}
//大于等于开始时间
if (!SysUtil.isNull(commParams.get("startt"))) {
dec.add(Restrictions.ge("createTime", commParams.get("startt")));
}
//小于等于结束时间
if (!SysUtil.isNull(commParams.get("endt"))) {
dec.add(Restrictions.le("createTime", commParams.get("endt")));
}
//默认排序
dec.addOrder(Order.desc("createTime"));
//dec.addOrder(Order.desc("jfWares.number"));
}
return super.getScrollData(firstresult, maxresult, dec);
}
@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
public QueryResult getScrollData(int firstindex, int maxresult, DetachedCriteria detachedCriteria) throws Exception {
QueryResult qr = new QueryResult();
public QueryResult getScrollData(int firstindex, int maxresult, DetachedCriteria detachedCriteria) throws Exception {
QueryResult qr = new QueryResult();
int total = this.getCountQuery(detachedCriteria);
List list = this.findPage(detachedCriteria, firstindex, maxresult);
qr.setResultlist(list);
qr.setTotalrecord(total);
return qr;
}
List list = this.findPage(detachedCriteria, firstindex, maxresult);
qr.setResultlist(list);
qr.setTotalrecord(total);
return qr;
}
0 0
- Hibernate之FetchMode.Join查询
- Hibernate中FetchMode.JOIN FetchMode.SELECT FetchMode.SUBSELECT介绍
- Hibernate中FetchMode.JOIN FetchMode.SELECT FetchMode.SUBSELECT介绍
- FetchMode.JOIN FetchMode.SELECT FetchMode.SUBSELECT 的区别
- hibernate FetchType和FetchMode
- Hibernate连接查询join
- @Fetch FetchMode=select/join/subselect
- FetchMode
- hibernate多表查询 join
- 让Criteria.setFecthMode(String,FetchMode)变为inner join
- Hibernate Criteria 关联查询(inner join 与 left join)
- Linq 之 join on 查询
- MySql学习之Join查询
- MySql学习之Join查询
- solr之高级查询--联表 join查询
- hibernate之HQL之inner join
- hibernate之HQL之left outer join
- hibernate之HQL之right outer join
- ViewPager高效PagerAdapter实现
- No.3:多重背包问题
- STL算法总结
- Windows7+Octopress+Github creat blogs by XiQi
- adb连接TV命令
- Hibernate之FetchMode.Join查询
- mfc父对话框调出子对话框显示数据的问题
- 用Nexus做Maven私服全攻略
- codeforces 394 B. Very Beautiful Number(思路较难,优化的地方多)好题。。。
- 设置DBGrid某列具有下拉列表框,下拉另一个DataSet的数据
- notifacationmanager使用原理
- 串口的RTL实现原理分析
- face databases
- java 自定义annotation