2013-07-09 69 views
-1

我遇到了一個問題:當我向具有別名字段名稱的數據庫發出SQL請求時,我無法使用h:dataTable(我使用JSF)顯示它們。如何通過別名獲取字段值,而不是通過JSF中的名稱獲取?

這裏的例子。請求:

SELECT 
    computers.name AS computers_name, 
FROM 
    computers 
WHERE 
    computers.id IS NOT NULL AND (computers.group_id=1); 

而XHTML代碼:

  <h:dataTable value="#{advancedSearchComp.computers}" 
        var="computer" rowClasses="oddTableRow, evenTableRow" 
        headerClass="tableHeader" styleClass="table"> 
       <h:column> 
        <f:facet name="header">name</f:facet> 
        #{computer.computers_name} 
       </h:column> 
      </h:dataTable> 

而且存在這樣一個問題,因爲H:列不能用別名得到字段的值,只有真實姓名,並返回null。

什麼是最好的解決方案呢?

我會很感激任何提示。

UPDATE。所有我所知道的手冊只考慮微不足道的情況「SELECT * FROM table」。

有沒有一種常見的方式來顯示JSF中的ResultSet,而沒有棘手的方法?

UPDATE。我做到了:

<h:dataTable value="#{advancedSearchComp.selectedComputers}" var="computer" rowClasses="oddTableRow, evenTableRow" 
         headerClass="tableHeader" styleClass="table"> 
       <h:column> 
        <f:facet name="header">id</f:facet> 
        #{computer.computers_id} 
       </h:column> 
       <h:column> 
        <f:facet name="name">Name</f:facet> 
        #{computer.computers_name} 
       </h:column> 
       <h:column> 
        <f:facet name="header">Location</f:facet> 
        #{computer.locations_name} 
       </h:column> 
       <h:column> 
        <f:facet name="header">Rack</f:facet> 
        #{computer.racks_name} 
       </h:column> 
       <h:column> 
        <f:facet name="header">Rack unit</f:facet> 
        #{computer.computers_rack_unit} 
       </h:column> 
       <h:column> 
        <f:facet name="header">Serial</f:facet> 
        #{computer.computers_serial} 
       </h:column> 
       <h:column> 
        <f:facet name="header">Inv number</f:facet> 
        #{computer.computers_inv_number} 
       </h:column> 
       <h:column> 
        <f:facet name="header">Status</f:facet> 
        #{computer.computers_status_name} 
       </h:column> 
      </h:dataTable> 

public List<ComputerWrapper> getSelectedComputers() throws SQLException{ 
    ComputerWrapper computer; 
    selectedComputers.clear(); 
    if (query==null) { 
     return null; 
    } 
    else { 
     Statement sth=dbhIrmdb.createStatement(); 
     ResultSet rowSet=sth.executeQuery(query); 
     while (rowSet.next()) { 
      computer=new ComputerWrapper(); 
      computer.setComputers_id(rowSet.getString("computers_id")); 
      computer.setComputers_name(rowSet.getString("computers_name")); 
      computer.setLocations_name(rowSet.getString("locations_name")); 
      computer.setRacks_name(rowSet.getString("racks_name")); 
      computer.setComputers_rack_unit(rowSet.getString("computers_rack_unit")); 
      computer.setComputers_serial(rowSet.getString("computers_serial")); 
      computer.setComputers_inv_number(rowSet.getString("computers_inv_number")); 
       computer.setComputers_status_name(rowSet.getString("computers_status_name")); 
      selectedComputers.add(computer); 
     }   
     sth.close(); 
     return selectedComputers; 
    } 

// return null; }

公共類ComputerWrapper { 私人字符串computers_id,computers_name,locations_name,racks_name,computers_rack_unit, computers_serial,computers_inv_number,computers_status_name;

public String getComputers_id() { 
    return computers_id; 
} 

public void setComputers_id(String computers_id) { 
    this.computers_id=computers_id; 
} 

public String getComputers_name() { 
    return computers_name; 
} 

public void setComputers_name(String computers_name) { 
    this.computers_name=computers_name; 
} 

public String getLocations_name() { 
    return locations_name; 
} 

public void setLocations_name(String locations_name) { 
    this.locations_name=locations_name; 
} 

public String getRacks_name() { 
    return racks_name; 
} 

public void setRacks_name(String racks_name) { 
    this.racks_name=racks_name; 
} 

public String getComputers_rack_unit() { 
    return computers_rack_unit; 
} 

public void setComputers_rack_unit(String computers_rack_unit) { 
    this.computers_rack_unit=computers_rack_unit; 
} 

public String getComputers_serial() { 
    return computers_serial; 
} 

public void setComputers_serial(String computers_serial) { 
    this.computers_serial=computers_serial; 
} 

public String getComputers_inv_number() { 
    return computers_inv_number; 
} 

public void setComputers_inv_number(String computers_inv_number) { 
    this.computers_inv_number=computers_inv_number; 
} 

public String getComputers_status_name() { 
    return computers_status_name; 
} 

public void setComputers_status_name(String computers_status_name) { 
    this.computers_status_name=computers_status_name; 
} 

public ComputerWrapper() { 
    computers_id=""; computers_name=""; locations_name=""; racks_name=""; computers_rack_unit=""; 
    computers_serial=""; computers_inv_number=""; computers_status_name=""; 
} 
+0

'advancedSearchComp'託管bean中的'computers'屬性是什麼? – Apurv

+0

是的,它是返回ResultSet的JavaBean訪問器。 –

+0

如何將查詢結果綁定到視圖,即如何執行查詢,從@ @ ManagedBean或使用JSTL''?這看起來很奇怪。另外,您使用的是哪個版本的JSF? –

回答

0

你需要創建一個類Computer

public class Computer{ 
    private String computerName; 
    // getter-setter 
} 

advancedSearchComp託管bean

@ManagedBean (name = "advancedSearchComp") 
public class AdvancedSearchComp{ 
    private List<Computer> computers; 
    // getter-setter 
    // code to populate computers and map result set to the Computer bean 
} 

要映射結果集到java bean中,你需要遍歷結果集,準備一份清單。

然後在XHTML

<h:dataTable value="#{advancedSearchComp.computers}" 
    var="computer" rowClasses="oddTableRow, evenTableRow" 
    headerClass="tableHeader" styleClass="table"> 
    <h:column> 
      <f:facet name="header">name</f:facet> 
      <h:outputText value = "#{computer.computerName}"/> 
    </h:column> 
</h:dataTable> 

更新: 如果你想顯示16或大量的字段,您有以下兩種選擇:

選項1所有字段添加然後如上顯示它們

選項2在bean中添加一個映射然後在XHTML中使用這張地圖。

public class Computer{ 
    private Map<String, Object> dataMap; 
    // getter-setter 
} 

而且對XHTML

<h:dataTable value="#{advancedSearchComp.computers}" 
    var="computer" rowClasses="oddTableRow, evenTableRow" 
    headerClass="tableHeader" styleClass="table"> 
    <h:column> 
      <f:facet name="header">name</f:facet> 
      <h:outputText value = "#{computer.dataMap['computerName']}"/> 
    </h:column> 
    <h:column> 
      <f:facet name="header">Brand</f:facet> 
      <h:outputText value = "#{computer.dataMap['computerBrand']}"/> 
    </h:column> 
</h:dataTable> 

遍歷結果集填寫的數據圖

ResultSet rs= statement.executeQuery(); 
if(rs!= null){ 
dataMap = new HashMap<String, Object>(); 
ResultSetMetaData rsmd = rs.getMetaData(); 
while(rs.next()){ 
    for(int _iterator = 0; _iterator < rsmd.getColumnCount(); _iterator++){ 
     String columnName = rsmd.getColumnName(_iterator + 1); 
    Object columnValue = rs.getObject(_iterator + 1); 
     dataMap.put(columnName , columnValue); 
    } 
} 
} 
+0

我考慮了它。但我必須展示16個領域,所以這不是一個奇特的決定。我必須創建16個字段。 –

+0

如果你想顯示16個字段,是的,你可以在計算機類中創建16個字段 或 你可以創建一個地圖來保存鍵值(字段名 - 字段值),然後在數據表中顯示這個地圖 – Apurv

+0

我認爲重寫ResultSet類能夠通過別名來處理字段,而不是真正的列名稱。 –

0

有沒有辦法通過別名來得到它。您必須將其分配給bean中某個實際對象。如果尚未創建適合於存儲來自ResultSet的結果的對象,請這樣做,將其傳遞到您的頁面並顯示。

它還有助於包裝你的名字圍繞的outputText標籤,像

<h:outputText value="#{computer.computersName}" /> 
+0

太奇怪了。 ResultSet.getString()完全適用於列別名。 –

+0

管理單元!當我在寫我的答案時,你發現了這一點:) –

0

如果advancedSearchCompcomputers屬性是ResultSet型的,那麼你應該能夠編寫這樣的事:

<h:dataTable value="#{advancedSearchComp.computers}" var="computer"> 
    <h:column> 
    <f:facet name="header">name</f:facet> 
    <h:outputText value="#{computer.getString('computers_name')}" /> 
    </h:column> 
</h:dataTable> 
+0

我試過了。結果是一樣的。 –

+0

這很奇怪。 不起作用。 –

+0

它會給你一個錯誤的描述嗎? –