對於物件查詢

2021-06-22 16:14:31 字數 3694 閱讀 4611

結論:

對於物件查詢

1、使用list的時候會將物件全部取出,而使用iterate則只先將物件主鍵取出,然後在使用的時候再乙個個取出。

2、list第二使用的時候會繼續重新資料庫中取出,而iterate則會先成快取中查詢,如果沒找到再去資料庫中取出。

對於屬性查詢(條件:查詢快取關閉):

兩者沒什麼差別,根據查詢物件的相應屬性,在執行查詢的時候將結果從資料庫中取出(不同於上面據說的iterate在使用物件的時候取出),同時兩者的第二次查詢也是直接從資料庫中取出資料,而不會從快取中取得。

注意:一級快取和二級快取都只是存放實體物件的,如果查詢實體物件的普通屬性的資料,只能放到查詢快取裡,查詢快取還存放查詢實體物件的id.

hibernate的查詢快取預設是關閉的,如果要使用就要到hibernate.cfg.xml檔案裡配置:

true

並且必須在程式中手動啟用查詢快取,在query介面中的setcacheable(true)方法來啟用。

實踐是檢驗真理的惟一標準:

iterate例項(查詢物件):

sessionfactory factory = new configuration()。configure()。buildsessionfactory();

session session=null;

session=factory.opensession();

session.begintransaction();

iterator iter = session.createquery

("from user s where s.id<3")。iterate();

while (iter.hasnext()) {

user age = (user) iter.next();

system.out.println(age);

system.out.println("--------------------------------------");

iter = session.createquery("from user s where s.id<3")。iterate();

while (iter.hasnext()) {

user age = (user) iter.next();

system.out.println(age);

session.gettransaction()。commit();

session.close();

結果如下:

hibernate: select user0_.id as col_0_0_ from user user0_ where user0_.id<3

hibernate: select user0_.id as id0_0_, user0_.username as username0_0_, user0_.age as age0_0_, user0_.password as password0_0_ from user user0_ where user0_.id=?

user [id=1, username=jay, age=8, password=jay]

hibernate: select user0_.id as id0_0_, user0_.username as username0_0_, user0_.age as age0_0_, user0_.password as password0_0_ from user user0_ where user0_.id=?

user [id=2, username=aa, age=3, password=aa]

hibernate: select user0_.id as col_0_0_ from user user0_ where user0_.id<3

user [id=1, username=jay, age=8, password=jay]

user [id=2, username=aa, age=3, password=aa]

從結果可知,第一次執行查詢語句時,只查詢了物件的id(主鍵),然後在每次使用具體物件時再進行查詢取出(1+n);由於hibrenate快取機制,第二次執行查詢語句是只執行了id(主鍵)查詢,物件結果卻是從快取中直接取得。

list例項(查詢物件):

sessionfactory factory = new configuration()。configure()。buildsessionfactory();

session session=null;

session=factory.opensession();

session.begintransaction();

listlist =(list) session.createquery

("from user s where s.id<3")。list();

for(user s:list){

system.out.println(s.tostring());

system.out.println("--------------------------------------");

list = session.createquery("from user s where s.id<3")。list();

for(user s:list){

system.out.println(s.tostring());

session.gettransaction()。commit();

session.close();

結果如下:

hibernate: select user0_.id as id0_, user0_.username as username0_, user0_.age as age0_, user0_.password as password0_ from user user0_ where user0_.id<3

user [id=1, username=jay, age=8, password=jay]

user [id=2, username=aa, age=3, password=aa]

hibernate: select user0_.id as id0_, user0_.username as username0_, user0_.age as age0_, user0_.password as password0_ from user user0_ where user0_.id<3

user [id=1, username=jay, age=8, password=jay]

user [id=2, username=aa, age=3, password=aa]

從結果可知,兩次執行查詢語句時都是將所有物件一次取出,即使第二執行查詢時也同樣執行查詢語句

混合情況例項(查詢物件;第一次用list,第二次用iterate):

sessionfactory factory = new configuration()。configure()。buildsessionfactory();

session session=null;

session=factory.opensession();

session.begintransaction();

listlist =(list) session.createquery

("from user s where s.id<3")。list();

for(user s:list){

system.out.println(s.tostring());

對於物件查詢

對於物件查詢 1 使用list的時候會將物件全部取出,而使用iterate則只先將物件主鍵取出,然後在使用的時候再乙個個取出。2 list第二使用的時候會繼續重新資料庫中取出,而iterate則會先成快取中查詢,如果沒找到再去資料庫中取出。對於屬性查詢 條件 查詢快取關閉 兩者沒什麼差別,根據查詢物...

對於oracle進行簡單樹查詢 遞迴查詢

deptid paredeptid name number number char 40 byte 部門id 父部門id 所屬部門id 部門名稱 通過子節點向根節點追朔.select from persons.dept start with deptid 76 connect by prior pa...

mysql,SQL語句對於時間的查詢

今天 select from 表名 where to days 時間欄位名 to days now 昨天select from 表名 where to days now to days 時間欄位名 1 7天select from 表名 where date sub curdate interval ...