1

次のように、JSP で有効な SQL ステートメントを使用したいと考えています。

<sql:query var="test" dataSource="DL">
select p.name name, j.description job_description, d.description department_description
from person as p, job as j, department as d
where ...
</sql:query>

3 つのテーブルに参加しているため、「説明」という 2 つの重複した名前があります。これは通常、これらのフィールド名のエイリアスを使用して SQL で解決します。JSP では、これは正しく処理されません。別名を介して結果セットにアクセスできず、"説明" のみが利用可能ですが、"job_description" または "department_description" は利用できません。

これは不十分です:

<c:forEach var="row" items="${test.rows}">
${row.description}
</c:forEach>

これはまったく機能しません:

<c:forEach var="row" items="${test.rows}">
${row.job_description}
</c:forEach>

この問題の解決策はありますか (これはバグです)?

これは私の context.xml です:

<Context path="/test" docBase="test" reloadable="true" crossContext="true">
  <Resource 
  name="DL" 
  auth="Container" 
  type="javax.sql.DataSource"
  maxActive="100" 
  maxIdle="30"
  maxWait="10000"
  username="xxx" 
  password="xxx" 
  driverClassName="com.mysql.jdbc.Driver"
  url="jdbc:mysql://localhost:3306/test"/>
</Context>
4

2 に答える 2

2

問題は のdataSource属性です<sql:query>。を使用して同じページでデータソースを宣言したと仮定します

<!-- rest of attributes omitted here -->
<sql:setDataSource var="DL">

そのはず

<sql:query var="test" dataSource="${DL}">
    your query...
</sql:query>

データ ソースが JNDI を使用して構成されている場合は、JNDI 名を使用する必要があります。

<sql:query var="test" dataSource="jdbc/DL">
    your query...
</sql:query>

関連している:


定義に基づいて、<Resorce>JNDI がデータソースをまったく見つけられないようです。名前を からname="DL"に変更し、 context.xmlファイルが Web プロジェクトの META-INF フォルダー内にあるname="jdbc/DL"ことを確認します。これがあれば、2 番目の例 (JNDI を使用) で述べたように定義する必要があります。<sql:query>


これに基づいてテストケースを実行した後<sql:query>、同じ列名が複数回ある場合のバグのように見えます。この質問の解決策を使用して解決しました: How to access duplicate column names with JSTL sql:query?

したがって、データ ソースが適切に構成されていると仮定すると、クエリを次のように変更するだけです。

<!-- I came up with the where part, it could be different in your case -->
<sql:query var="test" dataSource="jdbc/DL">
    select p.name name,
                concat(j.description, '') 'jdescription',
                concat(d.description, '') 'ddescription'
    from person p, job j, department d
    where p.jobID = j.id AND p.departmentID = d.id
</sql:query>

Descriptions:
<br />
<table>
<c:forEach var="row" items="${test.rows}">
    <tr>
        <td>${row.name}</td>
        <td>${row.jdescription}</td>
        <td>${row.ddescription}</td>
    </tr>
</c:forEach>

はい、それを処理するのは醜い方法ですが、JSTL を使用する他の解決策はないようです。推奨事項としては、サーブレットからデータを取得し、結果を request 属性の一部として設定して表示することをお勧めします。

于 2013-03-27T22:08:40.027 に答える
0

私の記憶が正しいかどうかは定かではありませんが、SQL ではASキーワードを使用してカラム エイリアスを作成する必要があると思います。

私が正しいかどうかはわかりませんが、これを試してください:

<sql:query var="test" dataSource="DL">
select p.name name, j.description as job_description, d.description as department_description
from person as p, job as j, department as d
where ...
</sql:query>

うまくいかない場合は、データベースで選択用のビューを作成し、そのビューから行を選択するか、重複する列の名前を変更してください。

于 2013-03-27T20:15:16.187 に答える