Java 在JSF中,如何通过别名而不是名称获取字段值?
我遇到了一个问题:当我向字段名带有别名的数据库发出SQL请求时,我不能用h:dataTable显示它们(我使用JSF) 这里是一个例子。请求:Java 在JSF中,如何通过别名而不是名称获取字段值?,java,mysql,jsf,jakarta-ee,jdbc,Java,Mysql,Jsf,Jakarta Ee,Jdbc,我遇到了一个问题:当我向字段名带有别名的数据库发出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="#{a
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>
您需要创建一个类
计算机
public class Computer{
private String computerName;
// getter-setter
}
advancedSearchComp
ManagedBean
@ManagedBean (name = "advancedSearchComp")
public class AdvancedSearchComp{
private List<Computer> computers;
// getter-setter
// code to populate computers and map result set to the Computer bean
}
@ManagedBean(name=“advancedSearchComp”)
公共类高级搜索公司{
私人名单计算机;
//吸气剂设定器
//用于填充计算机并将结果集映射到计算机bean的代码
}
要将结果集映射到JavaBean,需要迭代结果集并准备一个列表
然后在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个或大量字段,有以下两个选项:
选项1添加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>
名称
烙印
在resultset上迭代以填充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 );
}
}
}
ResultSet rs=statement.executeQuery();
如果(rs!=null){
dataMap=newhashmap();
ResultSetMetaData rsmd=rs.getMetaData();
while(rs.next()){
对于(int _iterator=0;_iterator
无法通过alias获取它。您必须将它指定给bean中某个实际的对象。如果您还没有创建一个定制的对象来存储ResultSet中的结果,请将其传递到页面并显示
它还有助于将您的名字包装在outputText标记周围,如
<h:outputText value="#{computer.computersName}" />
如果
advancedSearchComp
中的computers
属性的类型为ResultSet
,则您应该能够编写如下内容:
<h:dataTable value="#{advancedSearchComp.computers}" var="computer">
<h:column>
<f:facet name="header">name</f:facet>
<h:outputText value="#{computer.getString('computers_name')}" />
</h:column>
</h:dataTable>
名称
advancedSearchComp
managed bean中的computers
属性是什么?是的,它是返回结果集的JavaBean访问器。您如何将查询结果绑定到视图,即如何从@ManagedBean
或使用JSTL
执行查询?这看起来真奇怪。另外,您使用的是哪个版本的JSF?我在托管Bean中执行查询,函数返回ResultSet。我还使用了JSF2.2I,并将其考虑在内。但我必须显示16个字段,所以这不是一个花哨的决定。我必须创建16个字段。如果要显示16个字段,可以在计算机类中创建16个字段,也可以创建一个映射来保存键值(fieldname-fieldvalue)然后在DataTable中显示此映射我考虑重写ResultSet类,以便能够通过别名而不是实名来寻址字段。我会尝试使用HashMapI选项2,就像您所说的那样。h:dataTable中的单元格又是空的,看起来是同一个问题。这太奇怪了。getString()可以很好地处理列别名。Snap!你是在我写答案的时候发现的:)真奇怪。不起作用。不,桌子不见了。
<h:outputText value="#{computer.computersName}" />
<h:dataTable value="#{advancedSearchComp.computers}" var="computer">
<h:column>
<f:facet name="header">name</f:facet>
<h:outputText value="#{computer.getString('computers_name')}" />
</h:column>
</h:dataTable>