Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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
Grails GORM创建条件-使用SQL的“having”子句_Grails_Gorm_Createcriteria - Fatal编程技术网

Grails GORM创建条件-使用SQL的“having”子句

Grails GORM创建条件-使用SQL的“having”子句,grails,gorm,createcriteria,Grails,Gorm,Createcriteria,我有一个虚拟自助餐厅项目,其中我有三个域类:用户、产品和事务 以下是类的定义方式: class User { String name int employeeId long balance = 800 static constraints = { balance(max: 800L) } } class Product { String type int quantityInStock float pr

我有一个虚拟自助餐厅项目,其中我有三个域类:用户、产品和事务

以下是类的定义方式:

class User {

    String name
    int employeeId
    long balance = 800
    static constraints = {
        balance(max: 800L)
    }   
}

class Product {

    String type 
    int quantityInStock
    float price
    static constraints = {
    }
}

class Transaction {

    int quantityBought
    static belongsTo = [user: User, product: Product]
    static constraints = {
    }
}
现在我想找出购买了超过,比如说2种产品的用户数量/列表。 如何使用Grails createCriteria实现这一点

这就是我所尝试的:

Transaction.createCriteria().list(){
    projections {
        groupProperty('user')
        'product' {
            count('id','numberOfPurchases')
        }
    }
    gt('numberOfPurchases',2)
}
但它给出了以下错误:

Stacktrace:

org.hibernate.QueryException: could not resolve property: numberOfPurchases of: cafeteria.dummy.Transaction 
at grails.orm.HibernateCriteriaBuilder.invokeMethod(HibernateCriteriaBuilder.java:1618)                    
at Script1.run(Script1.groovy:4)                                                                           
at org.grails.plugins.console.ConsoleService.eval(ConsoleService.groovy:37)                                
at org.grails.plugins.console.ConsoleController.execute(ConsoleController.groovy:59)                       
at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:195)   
at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)                          
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)                         
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)                         
at java.lang.Thread.run(Thread.java:745)                                                                   
如何在projections块之外访问此别名numberOfPurchases以便在gt中使用它?

GORM内部使用Hibernate,目前Hibernate不支持Criteria API中的have子句。无法在投影块外获取numberOfPurchases的原因是限制已添加到where子句,并且不能在where子句中使用聚合别名。 虽然JPA支持有条款

但如果您仍然希望使用GORM标准实现这一点,您可以。但您必须稍微修改一下查询,它不涉及having子句的使用,并且需要一个子查询

修改后的查询将为:

SELECT DISTINCT this_.user_id FROM transaction this_ where 2 < (SELECT count(sub_.id) FROM transaction sub_ WHERE sub_.user_id=this_.user_id)
而戈姆则认为:

import org.hibernate.criterion.DetachedCriteria
import org.hibernate.criterion.Projections
import org.hibernate.criterion.Restrictions
import org.hibernate.criterion.Subqueries

DetachedCriteria subQuery = DetachedCriteria.forClass(Transaction, 'sub').with {
    setProjection Projections.count('sub.id')
    add Restrictions.eqProperty('sub.user', 'this.user')
}

List<User> users = Transaction.createCriteria().list() {
    projections {
        distinct("user")
    }
    add Subqueries.lt(2l, subQuery)
} 

可以将子查询与HQL一起使用。一些细节在@Mamun的第7.4节,我知道可以使用HQL完成。我想知道是否可以使用标准来完成。您可以使用DetachedCriteria,尽管它可能不像您预期的那样简单。谢谢您提供了信息丰富的解决方案,@Sandeep。实际上,我想澄清标准是否支持having子句。@Sakshinghal不,它不支持