我试图使用显示标记(http://displaytag.sf.net)将从Hibernate查询调用获得的结果显示为JSP上的表,但它不起作用。 该查询包含一个计数函数来获取行数。
public List<MyClass> getResults(String section)
{
try
{
List<MyClass> resultList = null;
final Session session = sessionFactory.getCurrentSession();
//Forming the inner query.
DetachedCriteria innerCriteria = DetachedCriteria.forClass(MySecondClass.class,"mySecondClass")
.add(Restrictions.eq("mySecondClass.section", section))
.setProjection(Property.forName("classId"));
//Form the outer query now.
final ProjectionList projection = Projections.projectionList();
projection.add(Projections.rowCount(),"count");
projection.add(Projections.groupProperty("companyName"));
final Criteria criteria = session.createCriteria(MyClass.class, "myClass");
criteria.add(Subqueries.propertyIn("classId", innerCriteria));
criteria.setProjection(projection);
resultList = criteria.list();
logger.info("Returned result with list "+resultList.size());
return resultList;
}
catch (Exception e)
{
e.printStackTrace();
}
}
使用上面的hibernate代码表示下面的查询:
Select Count(*),companyName from MyClass
where classId in (Select classId from MySecondClass where section='someValue')
group by companyName
查询在查询浏览器中以及在java中通过hibernate返回正确的值。尝试使用以下方法在JSP中显示结果时:
<display:table id="rowId" pagesize="5"
requestURI="/admin/getResult" name="resultList"
style="width: 100%;"
class="displayTable table table-bordered table-striped table-condensed">
<display:column property="companyName" title="Company"
class="displayTable"></display:column>
<display:column property="count" title="Row Count"
class="displayTable"></display:column>
</display:table>
从UI运行应用程序时,会显示以下错误:
javax.servlet.ServletException:javax.servlet.jsp.JspException:异常:[。FindookUtil]在对象类型“[Ljava.lang.Object;”中查找属性“companyName”时出错。原因:未知属性'companyName' org.displaytag.util.LookupUtil.getBeanProperty(LookupUtil.java:141) org.displaytag.model.Column.getValue(Column.java:124) org.displaytag.model.Column.createChoppedAndLinkedValue(Column.java:201)
结果集与显示表标记的绑定未正确完成。 我已经尝试了解StackOverFlow中的其他信息,但代码似乎没有任何错误。 另外如何在Java端显示计数值。
答案 0 :(得分:0)
我认为你可以尝试:
1)创建一个包含2个字段的类,代表您的数据 例如:
class Result
{
Long count;
String companyName;
// Getter & Setter
}
2 /在此类中添加默认构造函数
旁边的构造函数public Result(Long count, String companyName)
{
this.count = count;
this.companyName = companyName;
}
3 /在您的条件函数中添加变换器如下:
projection
.add(Projections.groupProperty("companyName"))
.setResultTransformer(new AliasToBeanConstructorResultTransformer(Result.class.getConstructors()[1]));
希望有所帮助