-1

私は 1 つの問題に遭遇しました: フィールド名のエイリアスを持つデータベースに SQL リクエストを行うと、h:dataTable でそれらを表示できません (私は 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:column はエイリアスでフィールド値を取得できず、実名でしか取得できず、null を返すという問題があります。

そのための最善の解決策は何ですか?

ヒントをいただければ幸いです。

アップデート。私が知っているすべてのマニュアルは、「SELECT * FROM table」という些細なケースのみを考慮しています。

トリッキーな方法なしで JSF に ResultSet を表示する一般的な方法はありますか?

アップデート。やったよ:

<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;
    }

// null を返します。}

public class ComputerWrapper { プライベート文字列 computer_id, computer_name, location_name, racks_name, computer_rack_unit, computer_serial, computer_inv_number, computer_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="";
}
4

3 に答える 3

0

エイリアス経由で取得する方法はありません。Bean のどこかにある実際のオブジェクトに割り当てる必要があります。ResultSet からの結果を格納するように調整されたオブジェクトをまだ作成していない場合は、作成してページに渡し、表示します。

次のように、名前を outputText タグで囲むことも役立ちます。

<h:outputText value="#{computer.computersName}" />
于 2013-07-09T08:59:16.530 に答える
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 個または多数のフィールドを表示する場合は、以下の 2 つのオプションがあります。

Option1 Beanにすべてのフィールドを追加し、上記のように表示します

オプション 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>

結果セットを繰り返し処理して dataMap を埋める

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 );
    }
}
}
于 2013-07-09T08:52:24.137 に答える