Hibernate多表查询、查询优化策略(四)
多表HQL
private static void innerJoin(){
//sql内连接 隐式内连接 select * from A,B where b.aid = a.id
// 显示内连接 select * from A inner join B on b.aid = a.id
//hql内连接 =>类似原生sql 返回合并的
Query query = session.createQuery("from Category c inner join c.products");
List<Object> objs = query.list();
for(Object o : objs){
System.out.println(o);
}
}
private static void innerJoinfetch(){
//迫切hql内连接 =>帮我进行封装
Query query = session.createQuery("from Category c inner join fetch c.products");
List<Category> categorys = query.list();
for(Category o : categorys){
System.out.println(o.getCname());
for(Product p : o.getProducts()){
System.out.println(p.getPname());
}
}
}
private static void leftJoin(){
//外连接 左外连接 select * from A left [outer] join B on b.aid = a.id
//hql 左连接
Query query = session.createQuery("from Category c left join c.products");
List<Object> objs = query.list();
for(Object o : objs){
System.out.println(o);
}
}
private static void leftJoinfetch(){
//hql 左连接 迫切
Query query = session.createQuery("from Category c left join fetch c.products");
List<Category> categorys = query.list();
for(Category o : categorys){
System.out.println(o.getCname());
for(Product p : o.getProducts()){
System.out.println(p.getPname());
}
}
}
private static void rightJoin(){
//外连接 右外连接 select * from A right [outer] join B on b.aid = a.id
//hql右连接
Query query = session.createQuery("from Category c right join c.products");
List<Object> objs = query.list();
for(Object o : objs){
System.out.println(o);
}
}
private static void rightJoinfetch(){
//外连接 右外连接 select * from A right [outer] join B on b.aid = a.id
//hql右连接 迫切
Query query = session.createQuery("from Category c right join fetch c.products");
List<Category> categorys = query.list();
for(Category o : categorys){
System.out.println(o.getCname());
for(Product p : o.getProducts()){
System.out.println(p.getPname());
}
}
}
Criteria(QBC)离线查询对象
//传统criteria是依赖于session的
Criteria criteria = session.createCriteria(Category.class);
criteria.add(Restrictions.eq("cid",1));
Category c = (Category) criteria.uniqueResult();
System.out.println(c.getCname()); //离线的criteria 凭空创建
//service/web层
DetachedCriteria dc = DetachedCriteria.forClass(Category.class);
dc.add(Restrictions.gt("cid",0));
//dao层
Criteria criter = dc.getExecutableCriteria(session);
List<Category> categories = criteria.list();
for(Category ca : categories){
System.out.println(ca.getCname());
for(Product p : ca.getProducts()){
System.out.println(p.getPname());
}
}
查询优化策略
懒加载(延迟加载):使用hibernate查询一个对象的时候,查询其关联对象,应该如何查询。是hibernate的一种优化手段。
类级别查询
session对象的load方法默认就是延迟加载, 可以在对象对应的配置文件中 class节点中配置lazy属性控制是否启用。如果false则会跟get没有任何区别。
public static void main(String[] args) {
Session session = HibernateUtils.openSession();
//get方法:立即加载,执行时立即发送sql语句
Category c = session.get(Category.class,1);
System.out.println(c);
//延迟加载:仅仅获得没有使用,不会查询 返回代理对象
Category c1 = session.load(Category.class,2);
//在使用对象的属性时才会进行查询
System.out.println(c1.getCname());
}
关联级别查询
集合关联级别
public static void main(String[] args) {
Session session = HibernateUtils.openSession();
//只返回Category表
Category c = session.get(Category.class,1);
System.out.println(c.getCname());
//懒加载 与此Category表相关联的Product表 使用时 才去加载
Set<Product> ps = c.getProducts(); //集合关联级别
for(Product p : ps){
System.out.println(p.getPname());
}
}
附上配置文件Category.hbm.xml
<hibernate-mapping package="com.hibernate.domain">
<class name="Category" table="Category" lazy="true">
<id name="cid" column="cid">
<generator class="native"/>
</id>
<property name="cname"/>
<!--lazy:集合关联级别 是否懒加载 true(默认) false extra(极其懒惰-如果只获得集合的size,他会用count去查询)
fetch(加载策略-使用什么类型的sql语句加载集合数据):
select(默认):单表查询加载
join:使用多表查询加载集合(无论是否启用懒加载,都一下多表查询回来)
subselect:使用子查询加载集合(调用集合时,使用子查询语句)
-->
<set name="products" inverse="true" lazy="true" fetch="select">
<key column="cpid"></key>
<one-to-many class="Product"></one-to-many>
</set>
</class>
</hibernate-mapping>
关联属性级别
public static void main(String[] args) {
Session session = HibernateUtils.openSession();
Product p = session.get(Product.class,1);
//根据产品去获得分类信息 执行如下时才会去数据库获取
Category c = p.getCategory(); //属性关联级别
System.out.println(c.getCname());
}
配置xml解析
<hibernate-mapping package="com.hibernate.domain">
<class name="Product" table="Product">
<id name="pid">
<generator class="native"/>
</id>
<property name="pname"/> <!--fetch(加载的sql语句):
select(默认):使用单表查询
join:使用多表查询
lazy(加载时机):
proxy(默认):由Category的类级别加载策略(Category中 class元素中 lazy)决定
false:立即加载
-->
<many-to-one name="category" class="Category" column="cpid" fetch="" lazy=""></many-to-one>
</class>
</hibernate-mapping>
批量抓取
public static void main(String[] args) {
Session session = HibernateUtils.openSession();
Query query = session.createQuery("from Category");
List<Category> categories = query.list();
for(Category c : categories){
for(Product p : c.getProducts()){ //categories数量为几 这里就要执行几次sql查询c.getProducts()
System.out.println(p.getPname());
}
}
}
category.hbm.xml
<hibernate-mapping package="com.hibernate.domain">
<class name="Category" table="Category" lazy="true">
<id name="cid" column="cid">
<generator class="native"/>
</id>
<property name="cname"/>
<!--batch-size:查询集合时一次查询多少个 默认1个 所以每次都会生成sql语句 -->
<set name="products" inverse="true" lazy="true" fetch="select" batch-size="10">
<key column="cpid"></key>
<one-to-many class="Product"></one-to-many>
</set>
</class>
</hibernate-mapping>
Hibernate多表查询、查询优化策略(四)的更多相关文章
- hibernate多表查询,结果封装在自己定义的一个实体类当中(在自己定义的类中增加构造函数)
hibernate的hql查询直接返回java对象时出现问题3 向大家请教一个问题,现在有三张表,表之间没有关联,我需要将三张表里面的所有东西查询出来存储到一个新的对象中,该如何实现,使用hibern ...
- Java面试题:Hibernate的二级缓存与Hibernate多表查询
我们来看两个有关Java框架之Hibernate的面试题,这是关于Hibernate的常考知识点. 1.请介绍一下Hibernate的二级缓存 解题按照以下思路来回答: (1)首先说清楚什么是缓存: ...
- hibernate多表查询
一对多进行查询(用懒加载的模式) 查找区域所对应的街道: Dao: public Qu selQu(String dno){ Session session=HibernateSessionFacto ...
- 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 检索(查询)策略
1.立即检索 (查询) 立即检索就是在调用get方法的时候,会直接向数据库发出sql语句查询,并将结果放到session缓存中,在查询的时候会将级联的对象一对查出,(发出多条sql语句): 明显的缺点 ...
- Hibernate 多表查询 - Criteria添加子字段查询条件 - 出错问题解决
Criteria 查询条件如果是子对象中的非主键字段会报 could not resolve property private Criteria getCriteria(Favorite favori ...
- 【Hibernate 多表查询】
HibernateManyTable public class HibernateManyTable { //演示hql左连接查询 @Test public void testSelect12() { ...
随机推荐
- 创建pod索引库(Specs)
专门用来存放xxx.podspec 的索引文件的库就叫做索引库.我们需要将这些索引文件上传到远程索引库才能保证其他的人能够拿来用. 创建一个远程索引库和本地索引库对应起来,步骤如下: 1.登录开源中国 ...
- 微智魔盒APP开发程序解析
微智魔盒系统开发找崔经理l88Z.6ZZ685l.微智魔盒app开发.微智魔盒商城开发.微智魔盒软件开发,微智魔盒模式开发,微智魔盒源码开发.微智魔盒开发. @Override publicvoidr ...
- Problem 30
Problem 30 https://projecteuler.net/problem=30 Surprisingly there are only three numbers that can be ...
- 【郑轻邀请赛 B】base64解密
[题目链接]:https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=2128 [题意] [题解] 把密文; 在表中找到每个字符对应的数字; 然后转换成相应的 ...
- ansible ad-hoc 参考
# 检查主机连接 # ansible test -m ping # 执行远程命令 # ansible test -m command -a 'uptime' # 执行主控端脚本 # ansible t ...
- LightOJ 1370 Bi-shoe and Phi-shoe
/* LightOJ 1370 Bi-shoe and Phi-shoe http://lightoj.com/login_main.php?url=volume_showproblem.php?pr ...
- h5 播放器 -3
autoplay <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- CreateDialog Win32 API调用的一个小问题
在老版本号的VC编译器上.关键调用是下面2句: InitCommonDialogs(); HWND hwndDialog = CreateDialog(hInstance, "IDD_XXX ...
- HDU2899 Strange fuction 【二分】
Strange fuction Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- jenkins集成钉钉
1.创建通知人群组,添加机器人 2.2.获取自定义机器人webhook 3.jenkins 安装"Dingding[钉钉] Plugin"插件: 4.插件安装完成后,创建/修改任务 ...