Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠HQL计数不工作?_Java_Spring_Hibernate_Grails_Hql - Fatal编程技术网

Java 休眠HQL计数不工作?

Java 休眠HQL计数不工作?,java,spring,hibernate,grails,hql,Java,Spring,Hibernate,Grails,Hql,我有以下课程: class User { hasMany = [ratings: Rating] } class Item { hasMany = [ratings: Rating] } class Rating { belongsTo = [user: User, item: Item] } 我想统计对某个项目进行评分的不同用户 以下操作不起作用: select count(distinct(r.user)) from Rating as r where r.

我有以下课程:

class User {
  hasMany = [ratings: Rating] 
} 

class Item {
 hasMany = [ratings: Rating]
}

class Rating {
 belongsTo = [user: User, item: Item]
}
我想统计对某个项目进行评分的不同用户

以下操作不起作用:

select count(distinct(r.user)) from Rating as r
        where r.item=:item
        group by r.user

我必须如何修改HQL查询才能使其工作?

这是在Hibernate条件中的操作方法

Criteria crit = session.createCriteria(Rating.class)
.add(Restrictions.like("item", item)
.addOrder(Order.asc("user"))
.setProjection(
       Projections.distinct(Projections.projectionList()
                        .add(Projections.property("user"), "user")))
.setResultTransformer(Transformers.aliasToBean(Rating.class));

您的查询应能按预期工作,只需对您使用
distinct
的方式稍作修改:

select count(distinct r.user) from Rating as r 
where r.item = :item group by r.user
执行此查询的另一种但更为冗长的方法是使用
User
join

select count(distinct u) from User as u 
inner join u.ratings as r where r.item = :item
group by r.user

只需在事务中运行查询

Transaction tx=session.beginTransaction;
//Run your query here
tx.commit();

这个问题是由于hibernate缓存而产生的。

我如何使用HQL实现这一点?从评级r中选择distinct r.user,其中r.item=:按r.user分组的项目;然后执行一个size()?有没有一种方法可以在一个查询中执行?这样做是不够的,因为您将列出每个记录,只是为了看看有多少记录存在。有关使用criteria的更好示例,请参见criteria API中的Projections.countDistinct()。如果您使用它,它将以更少的代码提供正确的行为。我认为可以使用crit.setProjection(Projections.countDistinct(“用户”);非常奇怪的是,distinct的count中的额外paren导致它失败并出现语法错误。这是正确的修复方法。当然为我节省了很多时间。