我的HQL代码:
select count(products.id) ,products.id, products.productDescription, p.products.productFileName
from Polls as p
group by products.id
order by count(products.id) desc
此查询返回
Coloumn 1 | Column 2 | Column 3 | Column 4
3 | 2 | Product1 | ProductFilename1
2 | 1 | Product2 | ProductFilename2
我希望将它们放在一个列表中,然后在jsp页面中显示它们。
我的问题是:我是否需要创建新类,因此我可以映射字段,因为此查询的计数? 有什么帮助吗?
我的课程是:
public class Polls implements java.io.Serializable {
private Integer id;
private Products products;
private Users users;
private Date voteDate;
public Polls() {
}
public Polls(Products products, Users users, Date voteDate) {
this.products = products;
this.users = users;
this.voteDate = voteDate;
}
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public Products getProducts() {
return this.products;
}
public void setProducts(Products products) {
this.products = products;
}
public Users getUsers() {
return this.users;
}
public void setUsers(Users users) {
this.users = users;
}
public Date getVoteDate() {
return this.voteDate;
}
public void setVoteDate(Date voteDate) {
this.voteDate = voteDate;
}
}
产品类别:
public class Products implements java.io.Serializable {
private Integer id;
private String productDescription;
private String productFileName;
private Set pollses = new HashSet(0);
public Products() {
}
public Products(String productDescription) {
this.productDescription = productDescription;
}
public Products(String productDescription, String productFileName, Set pollses) {
this.productDescription = productDescription;
this.productFileName = productFileName;
this.pollses = pollses;
}
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public String getProductDescription() {
return this.productDescription;
}
public void setProductDescription(String productDescription) {
this.productDescription = productDescription;
}
public String getProductFileName() {
return this.productFileName;
}
public void setProductFileName(String productFileName) {
this.productFileName = productFileName;
}
public Set getPollses() {
return this.pollses;
}
public void setPollses(Set pollses) {
this.pollses = pollses;
}
}
我正在尝试使用增强的for循环显示列表,如下所示:
<%
List<Object[]> myGadgets = new GadgetsRepository().getGadgetDescVotes();
for (Object p : myGadgets) {%>
<div class="gadgetItem">
<div><%=p[0]%> </div>//this don't work
</div>
<% }%>
答案 0 :(得分:2)
不一定,虽然创建一个新对象会更干净,更容易使用。除非您将其包装,否则您的查询应返回List<Object[]>
。因此,要渲染表,您可以遍历该集合。但是,如果您需要使用特定项作为基础类型,则需要进行强制转换。
我不确定你使用的是什么框架,但是这样的东西可以在纯jsp中使用:
<c:forEach value="${collection}" var="item">
<c:out value="${item[0]}" />
</c:forEach>
使用增强的for循环,您可以执行以下操作:
for(Object[] c : resultSet) {
//work with c[0], c[1], etc...
}
如果您确实创建了一个包装器对象,那么您将拥有使用字段名称来记录所显示内容的优势,并且您还将拥有基础字段的类型信息(而不是必须从{{1}进行强制转换。 })。
答案 1 :(得分:1)
您无需做任何事情。该查询返回可以使用vanilla JSP显示的数组列表。唯一的缺点是您需要通过索引而不是名称(行[0],行[1]等)访问字段。
将新对象映射到查询结果将是对Hibernate的一次重大误用,并可能在以后适得其反(当同一行可被不同对象修改时)。
不要觉得被迫一直使用ORM映射器。证据表明您需要一个简单的SQL查询。在您的示例中,您实际上并不是在操纵对象,而是将关系数据查询到报表中。只需抓住Connection对象(最好使用doWork方法并使用Work对象内部的连接),进行普通查询。
如果您真的讨厌SQL,请使用构造函数创建一个简单的对象(可以是不可变的),该构造函数将获取您需要的所有列和相关的getter。不要映射对象,而是将您的HQL更改为:
select new MyAggregatedPollRow(count(products.id) ,products.id, products.productDescription, p.products.productFileName) from Polls as p
group by products.id
order by count(products.id) desc
答案 2 :(得分:0)
利用hibernate如何轻松地为表编写方法。
你可以:
将HQL分成3个方法,每个方法都有一个查询,以获得您感兴趣的表的计数。
创建一个采用通用对象并获取enity计数的方法,然后将其重用于您认为合适的任何实体。