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 中,这没有正确处理,无法通过别名访问结果集,并且只有“description”可用,但“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"name="jdbc/DL"并确保您的context.xml文件位于 Web 项目的 META-INF 文件夹中。有了这个,那么您<sql:query>应该按照第二个示例中的说明进行定义(使用 JNDI)。


在基于此进行测试用例之后,<sql:query>当多次具有相同的列名时看起来像一个错误。我在这个问题中使用解决方案解决了:如何使用 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 的解决方案。作为建议,最好从 Servlet 获取数据并将结果设置为请求属性的一部分以便显示它。

于 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 回答