我想在我的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个重复的名称:“description”,我通常在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>
答案 0 :(得分: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>
中的错误。我使用此问题中的解决方案解决了问题: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。作为建议,最好从Servlet获取数据并将结果设置为请求属性的一部分以便显示它。
答案 1 :(得分: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>
如果它不起作用,那么只需在数据库中为您的选择创建一个视图,然后从该视图中选择行或重命名重复的列。