1

我的 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]%>&nbsp;</div>//this don't work
    </div>
<%  }%>
4

3 回答 3

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...
}

如果您确实创建了一个包装器对象,您将拥有记录显示内容的字段名称的优势,并且您还将获得基础字段的类型信息(而不是必须从 强制转换Object)。

于 2013-01-16T18:03:58.513 回答
1
  1. 你不需要做任何事情。该查询返回可以使用 vanilla JSP 显示的数组列表。唯一的缺点是您需要通过索引而不是名称(row[0]、row[1] 等)来访问字段。

  2. 将新对象映射到查询结果将是对 Hibernate 的主要误用,并且可能会适得其反(当同一行可以被不同的对象修改时)。

  3. 不要一直被迫使用 ORM 映射器。证据表明您需要一个普通的 SQL 查询。在您的示例中,您并没有真正操作对象,而是将关系数据查询到报告中。只需抓住 Connection 对象(最好使用 doWork 方法并使用 Work 对象内部的连接),进行普通查询。

  4. 如果您真的讨厌 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

于 2013-01-16T18:26:09.893 回答
0

充分利用 hibernate 为您的表编写方法带来的便利。

你可以:

将 HQL 拆分为 3 个方法,每个方法中都有一个查询,以获取您感兴趣的表的计数。

制作一个方法,该方法采用通用对象并获取实体的计数,然后将其重用于您认为合适的任何实体。

于 2013-01-16T18:37:48.333 回答