Primefacesのdatatableでのresultset表示について

解決済

回答 2

投稿 ・編集

  • 評価
  • クリップ 0
  • VIEW 4,028

edarion

score 5

Webアプリケーション作成にあたり、primefacesを使用しようと考えています。
そこで、必要になりそうな部品の確認を行っていたのですが、
datatableでデータがうまく表示されません。(no record foundになる)

コードは以下になります。
【index.xhtml】
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.org/ui">
    
    <h:head>
        <title>Sample</title>
    </h:head>

    <h:body>
        <p:dataTable var="dt1" value="#{bean.resultSet}">
            <p:column headerText="管理番号">
               <h:outputText value="#{dt1.No}" /> 
            </p:column> 
            <p:column headerText="顧客番号" >
                <h:outputText value="#{dt1.Kokyaku_No}" />
            </p:column> 
            <p:column headerText="種類" >
                <h:outputText value="#{dt1.Type}" />
            </p:column> 
            <p:column headerText="結果" >
                <h:outputText value="#{dt1.Result}" />
            </p:column>
        </p:dataTable>   
        <br />        
        <h:dataTable var="dt2" value="#{bean.resultSet}" border="1">         
            <h:column>
                <f:facet name="header">
                    <h:outputText value="管理番号"/>
                </f:facet>
                <h:outputText value="#{dt2.No}" />
            </h:column>
            <h:column >
                <f:facet name="header">
                    <h:outputText value="顧客番号"/>
                </f:facet>
                <h:outputText value="#{dt2.Kokyaku_No}" />
            </h:column> 
            <h:column >
                <f:facet name="header">
                    <h:outputText value="種類"/>
                </f:facet>
                <h:outputText value="#{dt2.Type}" />
            </h:column> 
            <h:column >
                <f:facet name="header">
                    <h:outputText value="結果"/>
                </f:facet>
                <h:outputText value="#{dt2.Result}" />
            </h:column>
        </h:dataTable>
    </h:body>
</html>
【Bean.java】
package mybean;

import javax.inject.Named;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
import java.util.ArrayList;
import java.io.*;
import java.util.List;
import java.sql.*;
import javax.annotation.PostConstruct;
        
@Named(value = "bean")
@RequestScoped
public class Bean {
    private ResultSet rs;
    private Connection conn;
    
    public Bean() {
    }
 
    @PostConstruct    
    public void init() {
        String jdbc_url = "jdbc:sqlserver://w2012-java\\JAVA;databaseName=test";
        String user = "sa";
        String password = "P@ssw0rd";
        
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            conn = DriverManager.getConnection(jdbc_url, user, password);
            Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
        
            String SQL = "SELECT * FROM test";
            rs = stmt.executeQuery(SQL);         
                        
        }catch (Exception e) {
            e.printStackTrace();
        }
                    
    }
        
    public ResultSet getResultSet(){
        return rs;
    }    
}

同じResultSetを使用している、<h:dataTable ~>側は問題なく表示されます。

何か思い当たる点はあるでしょうか?
よろしくお願いいたします


[環境]
jsf2.2
primefaces 5.1 
glassfish 4.1 
JDK 1.8.25 
NetBeans 8.0.2 
ブラウザ chrome,IE11
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

Valueで指定するデータの型が一致しないのが原因ではないでしょうか。EntityBeanを定義し、Listで渡せば良いかと思います。

以下の様なClassを作成します。(データ型は推測なので修正下さい)
package mybean;

public class Customer {
    private Integer No;
    private Integer Kokyaku_No;
    private String Type;
    private String Result;

    public Customer(Integer No, Integer Kokyaku_No, String Type, String Result) {
        this.No = No;
        this.Kokyaku_No = Kokyaku_No;
        this.Type = Type;
        this.Result = Result;
    }

    public Integer getNo() {
        return No;
    }

    public void setNo(Integer No) {
        this.No = No;
    }

    public Integer getKokyaku_No() {
        return Kokyaku_No;
    }

    public void setKokyaku_No(Integer Kokyaku_No) {
        this.Kokyaku_No = Kokyaku_No;
    }

    public String getType() {
        return Type;
    }

    public void setType(String Type) {
        this.Type = Type;
    }

    public String getResult() {
        return Result;
    }

    public void setResult(String Result) {
        this.Result = Result;
    }
    
}

BackingBeanではfaceletに渡すパラメータ型をResultSetからListに変更し、SQL実行後にResultSetからListに格納します。

package mybean;

import beans.*;
import java.io.Serializable;
import java.sql.*;
import java.util.*;
import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;

@Named(value = "bean")
@RequestScoped
public class Bean implements Serializable{
    
    private List<Customer> rs; 
        
    String jdbc_url = "jdbc:sqlserver://w2012-java\\JAVA;databaseName=test";
    String user = "sa";
    String password = "P@ssw0rd";
    
    @PostConstruct
    public void init(){
                 
        try {
            ResultSet result;
            Connection conn;
            
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            conn = DriverManager.getConnection(jdbc_url, user, password);
            Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                        ResultSet.CONCUR_READ_ONLY);        
            String SQL = "SELECT * FROM test";
            result = stmt.executeQuery(SQL);
            
            rs=new ArrayList<>();
            
            while(result.next()){
                rs.add(new Customer(result.getInt(1), result.getInt(2),
                                   result.getString(3), result.getString(4)));
            }          
            
        }catch (ClassNotFoundException | SQLException e) {
           e.printStackTrace();
        }
        
     
    }

    public List<Customer> getRs() {
        return rs;
    }

    public void setRs(List<Customer> rs) {
        this.rs = rs;
    }
    
}

ソースの実行確認までは出来ていないので、バグが有りましたら済みません。
自前の環境で類似のコードを試したら出来ました。ご参考までに。

以下はコメントに関する回答ですが、javaEEにおけるDBアクセス手段にEntityManagerを使用する手法が有ります。この場合、EntityBeanはTable毎に作成が必要となりますが(EntityBeanからTableをCreateするメソッドが有ります)Queryの結果はEntityBeanのListとなりますので、回答の様な変換は必要は無く相性は良いと思います。EntityBeanについて説明サイトは幾つか有りますが、自分は以下書籍で学習しています。

わかりやすいJava EE ウェブシステム入門

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/02/05 16:56

    上記のアドバイスを元に、Listをprimefacesのdatatableへ渡すことで
    データの表示は成功しました。
    ありがとうございます。

    最初に使用していたjsfのdatatableのValueには、
    ResultSetをそのまま渡して表示できていたため、
    JSFベースのリッチUIコンポーネントのprimefacesも
    同じ型で渡せるものかと思っていましたが、
    そうではなかったということですね。

    一般的にこういう処理を行いたい場合は、
    SQL文の結果に応じたエンティティクラスを
    個別に作っていくものなのでしょうか?

    キャンセル

  • 2015/02/05 17:15

    回答に追記しました。

    キャンセル

  • 2015/02/09 08:43

    遅くなりましたが、追加の回答ありがとうございました。
    紹介いただいた書籍を見て購入しましたが、回答の内容や、
    その他の疑問があった部分をかなり理解することができました。

    キャンセル

0

本がお役に立ったようで良かったです。私も時折読み直しながら、学習中です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる