2016-06-24 7 views
4

私は3つのドメインクラス:User,ProductおよびTransactionというダミーのカフェテリアプロジェクトを持っています。ここでGORM作成条件 - SQLのhaving節を使用

は、クラスが定義されている方法は次のとおりです。

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

しかし、それは次のエラーを与える:gtでそれを使用するように

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)                 

はどのようにして予測ブロックの外側、このエイリアスnumberOfPurchasesにアクセスすることができますか?

+0

あなたがHQLにサブクエリを使用することができます。いくつかの詳細はhttp://docs.grails.org/latest/guide/GORM.htmlのセクション7.4にあります。 – Mamun

+0

@Mamun、私はそれがHQLを使用して実行できることを認識しています。私はそれが基準を使って行うことができるかどうかを知りたがっていました。 –

+1

DetachedCriteriaを使用することはできますが、それはおそらく期待通りのものではないかもしれません。 – Mamun

答えて

2

内部的にGORMはHibernateを使用しており、現在HibernateはCriteria APIのhaving clauseをサポートしていません。 numberOfPurchasesをprojectionsブロックの外に置くことができない理由は、where句に制限が追加され、where句に集約エイリアスを使用できないためです。 JPAはhaving節をサポートしていますが。

しかし、まだGORM基準を使用してこれを達成したい場合は、できます。しかし、クエリを少し修正する必要があり、それは節を持つことを伴わず、サブクエリが必要になります。

修正クエリは次のようになります。

それは次のようになりますため
SELECT DISTINCT this_.user_id FROM transaction this_ where 2 < (SELECT count(sub_.id) FROM transaction sub_ WHERE sub_.user_id=this_.user_id) 

そしてGORM:

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) 
} 
+0

有益な解決策のおかげで@Sandeep。私は実際に 'Criteria'が' having節 'を支持しているかどうかを明確にしたかったのです。 –

+0

@SAKSHISINGHALいいえ –

関連する問題