hibernate多表查询
一对多进行查询(用懒加载的模式)
查找区域所对应的街道:
Dao:
public Qu selQu(String dno){
Session session=HibernateSessionFactory.getSession();
Transaction tr=session.beginTransaction();
Qu qu=null;
try {
qu=(Qu)session.load(Qu.class, dno);
tr.commit();
} catch (Exception e) {
// TODO: handle exception
tr.rollback();
}
return qu;
}
test:
public static void getDistinct(){
Dao dao=new Dao();
String dno="bj-dc";
try {
Qu qu=dao.selQu(dno);
System.out.println(qu.getDno()+"-----"+qu.getName());
Set<Jiedao> jiedaoset=qu.getJiedaos();
for(Jiedao j:jiedaoset){
System.out.println(j.getSno()+"-----"+j.getName());
}
} catch (Exception e) {
// TODO: handle exception
}finally {
HibernateSessionFactory.closeSession();
}
}
inner join fetch查询
查找街道所对应的区域:
dao:
public List<Qu> getQu(String jName){
Session session=HibernateSessionFactory.getSession();
String hql="from Qu q inner join fetch q.jiedao j where j.name=?";
Query query=session.createQuery(hql);
query.setString(0,jName);
return query.list();
}
test:
public static void getQu(){
String str="繁荣路";
Dao dao=new Dao();
List<Qu> list=dao.getQu(str);
for(Qu u:list){
System.out.println(u.getDno()+","+u.getName());
}
HibernateSessionFactory.closeSession();
}
多对一添加数据(同时添加街道(多)和区域(一)的数据)
dao:
public void addManyToOne(Qu qu,Set<Jiedao> set){
Session session=HibernateSessionFactory.getSession();
Transaction tr=session.beginTransaction();
try {
session.save(qu);
for(Jiedao j:set){
session.save(j);
}
tr.commit();
} catch (Exception e) {
// TODO: handle exception
}
}
test:
public void addManyToOne(){
Dao dao=new Dao();
Qu qu=new Qu();
qu.setDno("ed");
qu.setName("二道区");
Jiedao jd1=new Jiedao();
jd1.setSno("ed1");
jd1.setName("二道街1");
jd1.setQu(qu);
Jiedao jd2=new Jiedao();
jd2.setSno("ed2");
jd2.setName("二道街2");
jd2.setQu(qu);
Set<Jiedao> set=new HashSet<Jiedao>();
set.add(jd1);
set.add(jd2);
dao.addManyToOne(qu, set);
}
一对多添加数据(同时添加区域(一)和街道(多)的数据)
这里的dao层与多对一相同,省略不写,只更改test:
public void addOneToMany(){
Dao dao=new Dao();
Qu qu=new Qu();
qu.setDno("ed");
qu.setName("二道区");
Jiedao jd1=new Jiedao();
jd1.setSno("ed1");
jd1.setName("二道街1");
Jiedao jd2=new Jiedao();
jd2.setSno("ed2");
jd2.setName("二道街2");
Set<Jiedao> set=new HashSet<Jiedao>();
set.add(jd1);
set.add(jd2);
qu.setJiedaos(set);
dao.addManyToOne(qu, set);
}
注意:还需要在一的XML中把inverse改成false.
inverse:表示反向,是set集合的属性。
当inverse="true" 代表关系是由多方来维护的,也就是由街道方来维护的。
当inverse="false"代表由一方来维护多关系,也就是由区域方来维护关系。
这里我们要从区域方来添加街道中的数据,所以我们把这里改成inverse="false"
多表查询(查询出所有区域对应的街道的信息)
dao:
public List<Jiedao> getAllJiedao(){
List<Jiedao> list=new ArrayList<Jiedao>();
String hql="from Jiedao j inner join j.qu";
Session session=HibernateSessionFactory.getSession();
Query query=session.createQuery(hql);
Iterator it=query.iterate();
while(it.hasNext()){
Object [] obj=(Object [])it.next();
Jiedao jiedao=(Jiedao)obj[0];
Qu qu=(Qu)obj[1];
list.add(jiedao);
}
return list;
}
test:
public void getAllJiedao(){
Dao dao=new Dao();
List<Jiedao> list=dao.getAllJiedao();
for(Jiedao j:list){
System.out.println(j.getSno()+"-----"+j.getName());
}
HibernateSessionFactory.closeSession();
}
hibernate多表查询的更多相关文章
- hibernate多表查询,结果封装在自己定义的一个实体类当中(在自己定义的类中增加构造函数)
hibernate的hql查询直接返回java对象时出现问题3 向大家请教一个问题,现在有三张表,表之间没有关联,我需要将三张表里面的所有东西查询出来存储到一个新的对象中,该如何实现,使用hibern ...
- Java面试题:Hibernate的二级缓存与Hibernate多表查询
我们来看两个有关Java框架之Hibernate的面试题,这是关于Hibernate的常考知识点. 1.请介绍一下Hibernate的二级缓存 解题按照以下思路来回答: (1)首先说清楚什么是缓存: ...
- Hibernate多表查询、查询优化策略(四)
多表HQL private static void innerJoin(){ //sql内连接 隐式内连接 select * from A,B where b.aid = a.id // 显示内连接 ...
- hibernate 多表查询
Hibernate主要支持两种查询方式:HQL查询和Criteria查询.前者应用较为广发,后者也只是调用封装好的接口. 现在有一个问题,就是实现多表连接查询,且查询结果集不与任何一个实体类对应,怎么 ...
- hibernate多表查询封装实体
以前用sql实现联合查询 是非常简单的事,只需要写sql语句就可以,第一次遇到hibernate要实现多表联合查询的时候还楞了一下.最后看了下资料,才恍然大悟,hibernate实现多表联合查询跟SQ ...
- Hibernate多表查询连接操作
SQL多表操作分类; 1.交叉连接:select*from t_customer cross Join t_order; 2.显示内连接: select*from t_customer c inner ...
- Hibernate 多表查询 - Criteria添加子字段查询条件 - 出错问题解决
Criteria 查询条件如果是子对象中的非主键字段会报 could not resolve property private Criteria getCriteria(Favorite favori ...
- 【Hibernate 多表查询】
HibernateManyTable public class HibernateManyTable { //演示hql左连接查询 @Test public void testSelect12() { ...
- hibernate多表查询sql,以及所得对象的处理
String sql ="SELECT id FROM tea WHERE tea.name=? "; SQLQuery query = this.getSession().cre ...
随机推荐
- 转载:EJB到底是什么
这篇博客用通俗易懂的语言对EJB进行了介绍,写得很好,笔者在这里转载一下. 链接:https://www.cnblogs.com/strugglion/p/6027318.html
- substr在oracle和mysql中的应用和区别
Oracle: 书写格式: (1)Select substr(字段名(string) , 起始位置(int) , 截取长度(int)) 示例: selectsubstr('123456',0,3)a ...
- (五)、python 函数
一.函数 def 函数名(参数): ... 函数体 ... 返回值 函数的定义主要有如下要点: def:表示函数的关键字 函数名:函数的名称,日后根据函数名调用函数 函数体:函数中进行一系列的逻辑计算 ...
- Docker 运行MySQL 5.7
#在opt新建挂载目录 cd /opt #-v 显示创建的目录名 mkdir -vp docker_cfg/mysql/data docker_cfg/mysql/logs docker_cfg/my ...
- Apache Maven(四):依赖
依赖管理是Maven的特性之一,它是用户最为熟悉的特性之一,也是Maven擅长的领域之一.管理单个项目的依赖并没有太大困难,但是当您开始处理由数十或数百个模块组成的多模块项目和应用程序时,Maven可 ...
- 首层nginx 传递 二级代理,三级代理......多级代理nginx 客户端真实IP的方法
首层nginx(172.25.10.1):先获取真实IP($remote_addr),再将真实IP传递给X-Forwarded-For proxy_set_header X-Real-IP $r ...
- PHP错误:Warning: preg_replace() [function.preg-replace]: Unknown modifier '[' in
遇到一个PHP错误,错误提示是 Warning: preg_replace() [function.preg-replace]: Unknown modifier '[' in .... , 当然了 ...
- Python3爬虫(二)网络爬虫的尺寸与约束
Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.网络爬虫的尺寸: 1.小规模,数据量小,爬取速度不敏感,Requests库,爬取网页 2.中规模,数据规模较大 ...
- Big Truck
Photo by Phil Whitehouse Your boss has hired you to drive a big truck, transporting items between tw ...
- SQL 公用表表达式(CTE)
1.概念 公用表表达式(Common Table Expression)是SQL SERVER 2005版本之后引入的一个特性.CTE可以看作是一个临时的结果集,可以在接下来的一个SELECT,INS ...