hibernate 查詢與連接

drop database if exists schoolproject;
create database schoolproject;
use schoolproject;

drop table if exists certificate;
CREATE TABLE certificate (
  id 
varchar(100NOT NULL default '',
  `describe` 
varchar(100default '',
  
PRIMARY KEY  (id)
) ENGINE 
= InnoDB
CHARACTER SET utf8 COLLATE utf8_general_ci;


--
--
 Dumping data for table 'certificate'
--

INSERT INTO certificate VALUES ('ff80808105416d3b0105416d3eca0001','222');
INSERT INTO certificate VALUES ('ff808081054175b501054175b9190001','222');

--
--
 Table structure for table 'student'
--
drop table if exists student;
CREATE TABLE student (
  team_id 
varchar(100default '',
  id 
varchar(100NOT NULL default '',
  name 
varchar(20default '',
  `cardId` 
varchar(20NOT NULL default '',
  age 
int(11default '0',
  
PRIMARY KEY  (id)
) ENGINE 
= InnoDB
CHARACTER SET utf8 COLLATE utf8_general_ci;

--
--
 Dumping data for table 'student'
--

INSERT INTO student VALUES ('ff80808105416d3b0105416d3eca0002','ff80808105416d3b0105416d3eca0001','tomclus','200512345',33);
INSERT INTO student VALUES ('ff80808105416d3b0105416d3eca0002','ff808081054175b501054175b9190001','tom','11111111',33);

--
--
 Table structure for table 'team'
--
drop table if exists team;
CREATE TABLE team (
  id 
varchar(100NOT NULL default '',
  teamName 
varchar(100default '',
  
PRIMARY KEY  (id)
) ENGINE 
= InnoDB
CHARACTER SET utf8 COLLATE utf8_general_ci;

--
--
 Dumping data for table 'team'
--

INSERT INTO team VALUES ('ff80808105416d3b0105416d3eca0002','team1');

 
Student.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
    PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<hibernate-mapping >
    
<class name="model.Student" table="student" lazy="true"><!--把類和數表關聯起來-->
        
<id name="id" unsaved-value="null"><!--id的產生方式是uuid.hex-->
            
<generator class="uuid.hex" />
        
</id>
        
<property name="cardId" type="string" /><!--映射號-->
        
<property name="name" type="string" /><!--映射學生名-->
        
<property name="age" type="int" /><!--映射學生歲數-->
        
<many-to-one name="team" column="team_id" class="model.Team" cascade="none"  lazy="true"/><!--映射班級-->

    
</class>
</hibernate-mapping>

Team.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
    PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<hibernate-mapping>
    
<class name="model.Team" table="team" lazy="true"><!--把類和數表關聯起來-->
        
<id name="id" unsaved-value="null"><!--id的產生方式是uuid.hex-->
            
<generator class="uuid.hex" />
        
</id>
        
<property name="teamName" type="string" />
        
<set name="students" lazy="true" cascade="all">
            
<key column="team_id" />
            
<one-to-many class="model.Student" />
        
</set>
        
<set name="cers" lazy="true" cascade="all">
            
<key column="team_id" />
            
<one-to-many class="model.Certificate" />
        
</set>
    
</class>
</hibernate-mapping>

 

二、簡單的單表查詢

public static void showOneSheet() {
  List list = StudentDAO.getAllStu("from Student as s");
  for (int i=0;i<list.size();i++) {
   Student stu = (Student) list.get(i);
   System.out.println(stu.getName());//打印學生名
   System.out.println(stu.getTeam().getTeamName());//打印班級名
  }
 }

則,輸出:

Hibernate: select student0_.id as id, student0_.cardId as cardId0_, student0_.name as name0_, student0_.age as age0_, student0_.team_id as team5_0_ from student student0_
Hibernate: select team0_.id as id0_, team0_.teamName as teamName2_0_ from team team0_ where team0_.id=?

兩條sql語句。

總結:

1、當查詢子類時會立即加載其所對應的父類。

如果在子類的配置文件中配置了多個關聯父類,則在查詢子類時會將其所對應的多個父類加載出來,即每加載一個父類會連接一次數據庫產生一條sql語句。

共產生的sql語句的條數=子類+每個父類

2、訪問父類對象時,用子類對象.父類對象即可。

Team t = tu.getTeam();

三、外連接

1、什麼時候用外連接?

1)、如果想用一條sql語句查出子類與父類

2)、或是想將符合一個條件的某一張表A中的數據全部輸出,不管其連接的另外一張表B中有無表A中的記錄。

3)、父類加載子類時,我們一般情況不會在配置文件裏設置立即加載。而多數情況是父表對延遲加載。所以這時候用到了 left outer join

2、使用情況:

1)、子表外連接父表

 List list = StudentDAO.getAllStu("from Student as s left join s.team ");

Hibernate: select student0_.id as id0_, team1_.id as id1_, student0_.cardId as cardId0_0_, student0_.name as name0_0_, student0_.age as age0_0_, student0_.team_id as team5_0_0_, team1_.teamName as teamName2_1_ from student student0_ left outer join team team1_ on student0_.team_id=team1_.id

個人覺得沒必要這樣。

2)、父類外連接子類(多數情況)

List list = StudentDAO.getAllStu("from Team t left join t.students ");

Hibernate: select team0_.id as id0_, students1_.id as id1_, team0_.teamName as teamName2_0_, students1_.cardId as cardId0_1_, students1_.name as name0_1_, students1_.age as age0_1_, students1_.team_id as team5_0_1_ from team team0_ left outer join student students1_ on team0_.id=students1_.team_id

配置文件中可以不配置fetch="join" 或outer-join="auto"

取得每個對象:

Object stuAndTeam1[]=(Object[]) list.get(0);//取得第一個數組
  Student stu=(Student) stuAndTeam1[0];//

Team t = stu.getTeam();

 

四、預先抓取

待下篇幅

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章