Hibernate JPA count query可按查询对组的总结果行进行计数

Hibernate JPA count query可按查询对组的总结果行进行计数,hibernate,jpa,hql,Hibernate,Jpa,Hql,如何在JPQL中获取SQL查询下面的总结果行: select count(usertransa0_.id) as col_0_0_ from user_transaction usertransa0_ cross join merchant_master merchantma1_ where usertransa0_.merchant_master=merchantma1_.id an

如何在JPQL中获取SQL查询下面的总结果行:

select
        count(usertransa0_.id) as col_0_0_ 
    from
        user_transaction usertransa0_ cross 
    join
        merchant_master merchantma1_ 
    where
        usertransa0_.merchant_master=merchantma1_.id 
        and usertransa0_.status=0 
        and (
            usertransa0_.transaction_date between '2015-02-19' and '2015-02-20'
        ) 
    group by
        merchantma1_.full_name;
我试过:

SELECT COUNT(ut)
    FROM UserTransaction ut 
    WHERE ut.status = :stus AND ut.transactionDate between :frm AND :toDt"
    GROUP BY ut.merchantMaster.fullName
但它只返回第一行计数,如何才能得到总行数

编辑:

我的实体看起来像:

public class UserTransaction extends BaseEntity {

    @OneToOne(fetch = FetchType.LAZY)
    private UserInfo info;

    @OneToOne(fetch = FetchType.LAZY)
    private MerchantMaster merchantMaster;

    @OneToOne(fetch = FetchType.LAZY)
    private PaymentMaster paymentMaster;

    @Column(name = "AMOUNT")
    private BigDecimal amount;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "TRANSACTION_DATE")
    private Date transactionDate;

    @Column(name = "STATUS")
    private Integer status;

    private String userTransactionID;

    @OneToOne(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
    private UserTransactionRequest trRequest;

    @OneToOne(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
    private UserTransactionResponse trResponse;

    //getters & setters
}   

您的查询将返回一个Long数组。每个Long是给定MerchantMaster名称的
UserTransaction
计数

如果在NamedQuery中有查询,则可以使用(如果没有,则可以使用
creatiyQuery()
方法并使用JPQL查询字符串):

现在,查询将返回一个对象数组,第一个对象是count,第二个对象是name。您还需要修改代码以获得结果:

TypedQuery<Object[]> query = em.createNamedQuery("UserTransaction.MyQuery", Object[].class);
List<Object []> results = query.getResultList();
for (Object [] row : results) {
    Long count = (Long) row[0];
    String name = (String) row[1];
}
TypedQuery query=em.createNamedQuery(“UserTransaction.MyQuery”,Object[].class);
List results=query.getResultList();
对于(对象[]行:结果){
长计数=(长)行[0];
字符串名称=(字符串)行[1];
}

UserTransaction和MerchantMaster之间的关系是什么,
@OneToMany
?。您可以发布您的实体代码吗?@DavidSN no,
@OneToOne
relationship为任何JPQL查询生成的SQL都将显示在日志中,这样您就可以计算出需要什么,您希望得到什么结果?如果要获取UserTransaction的总计数,可以从JPQL查询中删除
group by
。此时,您的查询返回每个MerchantMaster的UserTransaction计数name@DavidSN我需要每个MerchantMaster名称的总计数。+1作为答案,但我需要分页结果,在分页中我必须找到按函数分组返回的结果总数。@Rembo我不确定这是否是您的意思,但是如果你想知道组的总数。您可以使用
query.getResultList().size()
SELECT COUNT(ut), ut.merchantMaster.fullName
FROM UserTransaction ut 
WHERE ut.status = :stus AND ut.transactionDate between :frm AND :toDt"
GROUP BY ut.merchantMaster.fullName
TypedQuery<Object[]> query = em.createNamedQuery("UserTransaction.MyQuery", Object[].class);
List<Object []> results = query.getResultList();
for (Object [] row : results) {
    Long count = (Long) row[0];
    String name = (String) row[1];
}