Java Hibernate选择count与其他列

时间:2013-01-16 16:34:18

标签: java hibernate hql

我的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>
<%  }%>

3 个答案:

答案 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)

  1. 您无需做任何事情。该查询返回可以使用vanilla JSP显示的数组列表。唯一的缺点是您需要通过索引而不是名称(行[0],行[1]等)访问字段。

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

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

  4. 如果您真的讨厌SQL,请使用构造函数创建一个简单的对象(可以是不可变的),该构造函数将获取您需要的所有列和相关的getter。不要映射对象,而是将您的HQL更改为:

  5. 
         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计数的方法,然后将其重用于您认为合适的任何实体。

相关问题