2017-02-24 45 views
0

有三個表<Table 1>, <Table 2> and <Table 3>JDBC左連接3臺

我的SQL是這樣的:

"Select table1.col1, table1.col2, table1.col3, table2.col4, table2.col5, table2.col6, 
table3.col7, table3.col8 from Table 1 as table1 
LEFT JOIN Table 2 as table2 on (table1.col1 = table2.col4) 
LEFT JOIN Table 3 as table3 on (table1.col1 = table3.col8)" 

正常的方式來獲得結果集是:

public List getExportDataList() throws ClassNotFoundException, SQLException { 
Connection connect = null; 
String url = "jdbc:....."; 

String username = "username "; 
String password = "password "; 

try { 
    connect = DriverManager.getConnection(url, username, password); 
} catch (SQLException ex) { 
    System.out.println("in exec"); 
    System.out.println(ex.getMessage()); 
} 

List dataList = new ArrayList<>(); 
PreparedStatement pstmt = connect.prepareStatement(
    THE SQL CODE SHOWN ABOVE 
} 

ResultSet rs = pstmt.executeQuery(); 

while(rs.next()){ 
Table1 table1 = new Table1(); 

table1.setCOL1(rs.getString("col1")); 
table1.setCOL2(rs.getString("col2")); 

dataList.add(table1); 
} 
rs.close(); 
pstmt.close(); 
connect.close(); 
return dataList; 
} 

從而使「dataList」可用於在Primefaces數據表中顯示數據。

但是,這種方式只能將表1中的列保存到「dataList」中。我試圖dataList.add(table2)以及dataList.add(table3)在同一時間,但有一個錯誤:「/reportGenerate.xhtml @ 50,75值=」#{reportData.dateCreated}「:類‘net.picary.model.Liaison’沒有'dateCreated'屬性。「

有人能告訴我如何將三個表中的所有選定列保存到「dataList」中嗎?或者有其他的方法來實現它?

+1

請顯示你使用的確切代碼和你得到的錯誤。另外請注意,當您按列名檢索值時,您需要確保這些名稱是唯一的。現在,您的結果集中有多列'col1',但您只能使用該名稱檢索第一個列,請參閱[這裏](http://stackoverflow.com/a/42410902/466862)。 –

+0

正如@Mark所示,您可能需要使用列別名來確保ResultSet中的列名是唯一的:'SELECT table1.col1 AS t1_col1,table2.col1 AS t2_col1,...' –

+0

感謝您的回覆。這是錯誤: 「/reportGenerate.xhtml @ 50,75 value =」#{reportData.dateCreated}「:類'net.picary.model.Liaison'沒有屬性'dateCreated'。」 – vennis

回答

0

首先,檢查是否列名(COL1,COL2,COL3 ..)是具有相同的名字在你的代碼在Java中所有三個數據庫表(表1,表2,表3)。

(IE)

... 
Table1 table1 = new Table1(); 

table1.setCOL1(rs.getString("col1")); 
table1.setCOL2(rs.getString("col2")); 

dataList.add(table1); 
.... 

在上面的代碼檢查是否具有「COL1」是同一個名字,在表1,表2分貝列,Table3.If列名(S)是數據庫不同,在你的代碼中,向你的MySQL查詢添加別名,並在你的java代碼中將它與相同的名稱進行匹配。

如果列名稱匹配,然後設置列值的表2和3

然後,把它添加到您的Datalist中。

.... 
.... 
table2.setCOL1(rs.getString("col1")); 
dataList.add(table2); 
.... 

等等。此外,檢查您已經添加的try/catch你的代碼,以避免像空指針,等等的SQLException異常..這可以在SQL交易出現。

+0

對此感到抱歉。每個表中的列名是唯一的。 – vennis

1

error: "/reportGenerate.xhtml @50,75 value="#{reportData.dateCreated}": The class 'net.picary.model.Liaison' does not have the property 'dateCreated'."

你的問題不在於查詢或JDBC,你應該確保屬性dateCreatednet.picary.model.Liaison類存在與getter和setter是這樣的:

private Date dateCreated; 
public String name; 
public String experience; 

public Date getDateCreated() { 
    return dateCreated; 
} 

public void setDateCreated(Date dateCreated) { 
    this.dateCreated = dateCreated; 
} 

所以,當你的頁面reportGenerate.xhtml嘗試加載這個屬性也找不到它,因爲:

  1. 在你的類不存在
  2. 它存在,但它是私有的,沒有getter和setter。

因此,請確保您的屬性存在,並有gtter和setter,這可以解決您的錯誤。

編輯

你有兩個選擇:

  1. 當你得到你的結果,你應該使用類型表1,表2,表3的3名單,並在同一迴路這樣填充它們:
 
    List dataList1 = ...; 
    List dataList2 = ...; 
    List dataList3 = ...; 

    while(rs.next()){ 
     table1 = new Table1(); 
     table1.setCOL1(rs.getString("col1")); 
     ... 
     dataList1.add(table1); 

     table2 = new Table2(); 
     table2.setCOL1(rs.getString("col1")); 
     ... 
     dataList2.add(table2); 

     table3 = new Table3(); 
     table3.setCOL1(rs.getString("col1")); 
     ... 
     dataList3.add(table3); 
    } 

,並在您的XHTML頁面,你不得不使用這三款列表,而不是一個

  • 創建新的對象,其結合這三個表所示:
  •  
    
        class MyObject { 
         private Table1 table1; 
         private Table2 table2; 
         //constructor 
         //getters and setters 
        } 
    
    

    然後創建一個List<MyObject> list = ....;和在每個表中設置的信息。

    希望你明白我的觀點,祝你好運

    +0

    問題是,dataCreated是另一個類中的一列。例如,Liaison就是上面提到的表2,但dataCreated屬於表1.顯然,聯絡中沒有dataCreated。這就是爲什麼我很困惑。 – vennis

    +0

    你能編輯和提供你的類的設計,所以我們可以瞭解更多@vennis –

    +0

    我只是想知道是否有可能從3個不同的類保存到一個列表的數據?我試圖「dataList.add(table1);」只有,這意味着我從來沒有dataList.add另外兩個表。它能夠在xhtml文件中顯示正確的數據(左連接表之後的表1中的列)(我註釋掉表2和表3中的列)。但我需要顯示三個表中的所有選定列,而不僅僅是表1.所以我想知道是不是因爲無法將來自不同類的數據保存在一個列表中? – vennis