亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

HibernateQL

2019-11-14 20:54:14
字體:
來源:轉載
供稿:網友
HibernateQL查詢語言---QL(Query Language)

 

NativeSQL-------功能最強大

HQL--Hibernate QL

EJB QL (JP QL)---HQL的一個子集

QBC---Query By Criteria

QBE---Query By Example------功能最小

 

本節主要介紹EJB QL,它是HQL的子集

使用的是:org.hibernate.Query

 

示例:

Category版塊:id,name

Topic主題:id,title,createDate,category

Msg回帖:id,cont,topic

Topic(多對一)Category

Msg(多對一)Topic

 

1.建Category、Topic、Msg實體類

2.在hibernate.cfg.xml中添加mapping語句

3.建Junit測試類

3.1 寫測試方法testSchemaExport(),建好表

3.2 寫測試方法testSave(),在每張表里存10條數據,如下:

@Testpublic void testSave() {session session = sf.getCurrentSession();session.beginTransaction();//存入10個版塊for(int i=0;i<10;i++){Category category = new Category();category.setName("c"+i);session.save(category);}//存入10個主題,屬于category_1for(int i=0;i<10;i++){Category category = new Category();category.setId(1);Topic topic = new Topic();topic.setTitle("t"+i);topic.setCteateDate(new Date());topic.setCategory(category);session.save(topic);}//存入10條回帖,屬于topic_1for(int i=0;i<10;i++){Topic topic = new Topic();topic.setId(1);Msg msg = new Msg();msg.setCont("m"+i);msg.setTopic(topic);session.save(msg);}session.getTransaction().commit();}

以下表格依次為category、topic、msg

category   topic   msg

3.3 寫測試方法testHQL(),進行相關查詢

@Testpublic void testHQL() {Session session = sf.getCurrentSession();session.beginTransaction();//注意,EJBQL是面向對象的查詢語言,Category是實體類的名字,不能寫表名categoryQuery q = session.createQuery("from Category");for(Object o : q.list()){Category c = (Category) o;System.out.PRintln( c.getId()+ "-" +c.getName());}session.getTransaction().commit();}

 

EJB QL 查詢語句---舉例:

1.以對象的形式取出

Query q = session.createQuery("from Category");Query q = session.createQuery("from Category c where c.name > 'c5'");Query q = session.createQuery("from Category c order by c.name desc");Query q = session.createQuery("select distinct c from Category c order by c.name desc");//這里,冒號是占位符Query q = session.createQuery("from Category c where c.id > :min and c.id < :max");q.setParameter("min", 2);//q.setInteger("max", 8);  //兩種方式皆可//分頁顯示Query q = session.createQuery("from Category c order by c.name desc");q.setMaxResults(4);   //每頁顯示4條q.setFirstResult(2);  //從第2條開始顯示Query q = session.createQuery("from Msg m where m.topic.category.id=1");Query q = session.createQuery("from Msg m where m.id between 3 and 5");Query q = session.createQuery("from Msg m where m.id in (3,4,5)");Query q = session.createQuery("from Msg m where m.cont is not null");Query q = session.createQuery("from Topic t where t.category.id=1");//若測試此語句,需在Topic實體類中設置@OneToMany注解,對MsgQuery q = session.createQuery("from Topic t where t.msgs is empty");Query q = session.createQuery("from Topic t where t.title like '%5'");Query q = session.createQuery("from Topic t where t.title like '_5'");Query q = session.createQuery("from Topic t where t.id < (select avg(t.id) from Topic t)") ;Query q = session.createQuery("from Topic t where t.id < ALL (select t.id from Topic t where mod(t.id, 2)= 0) ");//用in 可以實現exists的功能//但是exists執行效率高Query q = session.createQuery("from Topic t where not exists (select m.id from Msg m where m.topic.id=t.id)") ;Query q = session.createQuery("from Topic t where exists (select m.id from Msg m where m.topic.id=t.id)") ;Query q = session.createQuery("from Topic t where t.id in (select m.id from Msg m where m.topic.id=t.id)") ;session.createQuery("update Topic t set t.title = upper(t.title)").executeUpdate();Query q = session.createQuery("from Topic");

 

2.以字段的形式取出

Query q = session.createQuery("select c.id, c.name from Category c order by c.name desc");//為什么不能直接寫Category名,而必須寫t.category//因為有可能存在多個成員變量(同一個類),需要指明用哪一個成員變量的連接條件來做連接Query q = session.createQuery("select t.title, c.name from Topic t join t.category c");Query q = session.createQuery("select lower(t.title)," +           "upper(t.title)," +          "trim(t.title)," +          "concat(t.title, '***')," +          "length(t.title)" +          " from Topic t ");Query q = session.createQuery("select abs(t.id)," +         "sqrt(t.id)," +         "mod(t.id, 2)" +         " from Topic t ");Query q = session.createQuery("select current_date, current_time, current_timestamp, t.id from Topic t");Query q = session.createQuery("select t.title, count(*) from Topic t group by t.title") ;Query q = session.createQuery("select t.title, count(*) from Topic t group by t.title having count(*) >= 1") ;

 

1.以對象的形式取出---打印輸出語句

//可以用List打印輸出List<Category> categories = (List<Category>)q.list();for(Category c : categories){System.out.println(c.getId() + "-" + c.getName());}//List也可以寫成如下形式for(Object o : q.list()){Category c = (Category) o;System.out.println( c.getId()+ "-" +c.getName());}//也可以用iterate打印輸出Iterator<Category> it = (Iterator<Category>) q.iterate();while(it.hasNext()){Category c = it.next();System.out.println(c.getId()+"-"+c.getName());}

 

2.以字段的形式取出---打印輸出語句   

//List,以數組的形式取出for(Object o : q.list()){Object[] obj = (Object[])o;System.out.println(obj[0]+ "-" + obj[1]);}//List的另一種形式List<Object[]> categories = (List<Object[]>)q.list();for(Object[] o : categories){System.out.println(o[0] + "-" + o[1]);}

 

3.查詢結果只有一個值時---q.uniqueResult()

Query q = session.createQuery("select count(*) from Msg");//當查詢結果只有一個值的時候用q.uniqueResult()//count(*)返回的是一個Long類型Long count = (Long) q.uniqueResult();System.out.println(count);Query q = session.createQuery("select max(m.id), min(m.id), avg(m.id), sum(m.id) from Msg m");Object[] o = (Object[]) q.uniqueResult();System.out.println(o[0]+"-"+o[1]+"-"+o[2]+"-"+o[3]);

 

1.list() 和 iterate()

Query q = session.createQuery("from Category");List<Category> categories = (List<Category>)q.list();或者:Iterator<Category> it = (Iterator<Category>) q.iterate();區別:1.list取所有2.Iterate先取ID,等用到的時候再根據ID來取對象3.Session中list第二次發出,仍會到數據庫查詢4.Literate第二次,首先找session級緩存

 

2. Hibernate 1+N問題

對于兩個關聯關系的表Topic(多對一)Category,當獲取Topic對象的時候(Query q = session.createQuery("from Topic");),除了會發出查詢Topic表的SQL語句,也會發出查詢其關聯的Category表的SQL語句。解決辦法:1.將@ManyToOne注解的fetch屬性設置為LAZY2.將@在Category的@Entity注解下面一行添加@BatchSize(size=5)注解   意思是,獲取Category對象的時候,一次性獲取5條數據。即如果一共有10條數據,那么只會發出兩條SQL語句3.進行左連接,即將查詢語句改為:Query q = session.createQuery("from Topic t left join fetch t.category");
3. 一級緩存、二級緩存、查詢緩
1.什么是緩存:在內存里開辟一塊空間,把本來應該存在硬盤上的東西,放到內存里,將來再讀取的時候,直接從內存里讀,這部分內存就叫緩存。2.一級緩存---session級別的緩存3.二級緩存---sessionFactory級別的緩存,可以跨越session存在4.hibernate.cfg.xml配置<property name="cache.use_second_level_cache">true</property><property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>5.load默認使用二級緩存,iterate默認使用二級緩存6.list默認往二級緩存加數據,但是查詢的時候不使用7.如果query用二級緩存,需打開查詢緩存

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品日日摸夜夜添夜夜av| 国产精品自拍视频| 日韩女优人人人人射在线视频| 91在线观看免费观看| 亚洲va国产va天堂va久久| 久久av资源网站| 国产视频精品一区二区三区| 国产精品三级网站| 亚洲精品日韩在线| 亚洲精品www久久久久久广东| 日韩av在线网页| 欧美情侣性视频| 日韩激情在线视频| 国产成人啪精品视频免费网| 国产丝袜一区视频在线观看| 日韩欧美国产黄色| 福利微拍一区二区| 日韩有码在线观看| 欧美限制级电影在线观看| 久久精品国产成人精品| 成人福利免费观看| 日韩欧美一区二区在线| 丝袜亚洲欧美日韩综合| 精品国产一区二区三区久久狼5月| 久久精品精品电影网| 最近2019中文字幕大全第二页| 国产精品欧美日韩| 国产成人一区二区三区电影| 尤物tv国产一区| 欧美日韩国产第一页| 日韩经典中文字幕在线观看| 欧美天天综合色影久久精品| 中文字幕在线看视频国产欧美| 91精品国产高清久久久久久91| 神马国产精品影院av| 欧美日韩激情美女| 久久精品青青大伊人av| 日韩欧美国产免费播放| 国产精品美女在线| 久久久综合av| 欧美日韩ab片| 亚洲亚裔videos黑人hd| 亚洲精品美女久久| 色综合色综合久久综合频道88| 欧美日韩精品中文字幕| 久久久免费精品视频| 91福利视频网| 国内精品视频一区| 不卡在线观看电视剧完整版| 一区二区三区高清国产| 91av在线影院| 日韩欧美高清在线视频| 亚洲成人激情小说| 国产精品入口免费视| 91精品视频播放| 亚洲理论在线a中文字幕| 国产日韩欧美在线观看| 中文字幕精品—区二区| 色在人av网站天堂精品| 中文字幕亚洲欧美日韩在线不卡| 伊人久久久久久久久久| 亚洲精品动漫100p| 在线观看不卡av| 亚洲黄色在线观看| 亚洲国产欧美一区二区三区同亚洲| 国产美女搞久久| 国产精品日韩一区| 韩国一区二区电影| 国产精品成人国产乱一区| 欧美激情一区二区三区久久久| 国内精品视频久久| 国产精品成人久久久久| 久久久免费高清电视剧观看| 92看片淫黄大片欧美看国产片| 亚洲精品女av网站| 久久久av一区| 欧美中文字幕在线播放| 国产精品成熟老女人| 日本免费久久高清视频| 欧美电影院免费观看| 欧美国产第二页| 中文字幕国内精品| 亚洲午夜未满十八勿入免费观看全集| 亚洲日韩第一页| 亚洲男人天堂2023| 98午夜经典影视| 国模极品一区二区三区| 精品久久久久久久久久久久| 91国产精品视频在线| 日韩久久免费视频| 久久露脸国产精品| 亚洲国产成人精品一区二区| 成人有码在线播放| 九九精品在线播放| 欧美激情精品久久久久久黑人| 性亚洲最疯狂xxxx高清| 不卡中文字幕av| 久久久极品av| 2019中文字幕免费视频| 久久久久久国产三级电影| www高清在线视频日韩欧美| 九九久久久久久久久激情| 日韩在线观看免费| 国产精品18久久久久久麻辣| 国产一区视频在线| 国产成人精品视频在线| 欧美电影免费在线观看| 国内精品视频久久| 国产精品色午夜在线观看| 久久久女人电视剧免费播放下载| 亚洲三级 欧美三级| 久久99青青精品免费观看| 亚洲成人网av| 欧美午夜视频一区二区| 国产免费一区二区三区香蕉精| 日韩一二三在线视频播| 久久久www成人免费精品张筱雨| 欧美性色xo影院| 国产偷亚洲偷欧美偷精品| www亚洲精品| 国产欧美亚洲精品| 中文字幕亚洲一区| 国产精品爱啪在线线免费观看| 日韩欧中文字幕| 亚洲人成啪啪网站| 国产日韩欧美在线| 国内精品久久久久久中文字幕| 成人av电影天堂| 青草青草久热精品视频在线观看| 日韩女优人人人人射在线视频| 日韩亚洲欧美成人| 日韩精品在线观看网站| 欧美成人亚洲成人| 亚洲自拍偷拍区| 欧美午夜激情在线| 欧美视频在线观看免费| 欧美日韩国产一区二区三区| 欧美高清不卡在线| 在线电影中文日韩| 欧美视频在线看| 国产日韩精品综合网站| 成人国产亚洲精品a区天堂华泰| 日本电影亚洲天堂| 国产欧美一区二区三区视频| 欧美日韩免费区域视频在线观看| 亚洲sss综合天堂久久| 亚洲国产精品人人爽夜夜爽| 欧美精品日韩三级| 最近日韩中文字幕中文| 欧美午夜丰满在线18影院| 国产精品18久久久久久麻辣| 一区二区三区天堂av| 国内精品久久久久伊人av| 国产97色在线|日韩| 91久久中文字幕| 欧美日韩国产精品一区二区三区四区| 高清一区二区三区日本久| 国产69精品久久久久9| xxxxx91麻豆| 国产亚洲一区二区在线| 隔壁老王国产在线精品| 色偷偷噜噜噜亚洲男人| 97免费在线视频| 美女扒开尿口让男人操亚洲视频网站|