2017-02-24 129 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