1

Grails で、できれば HQL から GROUP_CONCAT 集計関数を使用する必要がありますが、基準を使用しても問題ありません。

私はこのクエリを持っています:

ClickTracking.executeQuery("SELECT pageId, containerId, GROUP_CONCAT(clicks) as click" +
                                            "FROM  ClickTracking " +
                                            "WHERE pageId =  ? " +
                                            "GROUP BY containerId ", [pageId])

DB固有であるため、HQLはGROUP_CONCATを認識していないため、これは機能しません。プロジェクトを MySQL と結び付けても問題ないので、これを BootStrap.groovy に追加しようとしました。

Configuration conf = grailsApplication.getMainContext().getBean("&sessionFactory").configuration;
conf.addSqlFunction("GROUP_CONCAT", new StandardSQLFunction("GROUP_CONCAT", new StringType()));

運がない。

次に、方言をサブクラス化して使用しようとしました。

import org.hibernate.dialect.MySQL5InnoDBDialect
import org.hibernate.dialect.function.StandardSQLFunction
import org.hibernate.Hibernate

class ExtendedMySqlDialect extends MySQL5InnoDBDialect {

public ExtendedMySqlDialect() {
    super();
    registerFunction("GROUP_CONCAT", new StandardSQLFunction("GROUP_CONCAT", Hibernate.STRING));

}

}

および DataSource.groovy で

dataSource {
pooled = true
driverClassName = "com.mysql.jdbc.Driver"
dialect = "ExtendedMySqlDialect"
logSql = true

}

まだ運がありません。私は得る:

No data type for node: org.hibernate.hql.ast.tree.MethodNode 

-[METHOD_CALL] MethodNode: '(' +-[METHOD_NAME] IdentNode: 'GROUP_CONCAT' {originalText=GROUP_CONCAT} -[EXPR_LIST] SqlNode: 'exprList' -[DOT] DotNode: 'clicktrack0_.clicks' {propertyName=clicks,dereferenceType =ALL,propertyPath=clicks,path={synthetic-alias}.clicks,tableAlias=clicktrack0_,className=com.ui.gorm.ClickTracking,classAlias=null} +-[IDENT] IdentNode: '{synthetic-alias}' { originalText={synthetic-alias}} -[IDENT] IdentNode: 'clicks' {originalText=clicks} . スタックトレースは次のとおりです: Message: No data type for node: org.hibernate.hql.ast.tree.MethodNode -[METHOD_CALL] MethodNode : '(' +-[METHOD_NAME] IdentNode: 'GROUP_CONCAT' {originalText=GROUP_CONCAT} -[EXPR_LIST] SqlNode: 'exprList' -[DOT] DotNode: 'clicktrack0_.clicks'{propertyName=clicks,dereferenceType=ALL,propertyPath=clicks,path={synthetic-alias}.clicks,tableAlias=clicktrack0_,className=com.ui.gorm.ClickTracking,classAlias=null} +-[IDENT] IdentNode: '{合成エイリアス}' {originalText={合成エイリアス}} -[IDENT] IdentNode: 'クリック' {originalText=クリック}

Line | Method

->> 156 | org.hibernate.hql.ast.tree.SelectClause の initializeExplicitSelectClause

ブレークポイントを設定して grailsApplication.getMainContext().getBean("&sessionFactory").configuration を調べると、そこに sqlFuncions という名前のプロパティと GROUP_COCNAT が見つかります。

デバッグを行ったところ、次のコードで SelectExpressionList.java になりました。

public SelectExpression[] collectSelectExpressions() {
    // Get the first child to be considered.  Sub-classes may do this differently in order to skip nodes that
    // are not select expressions (e.g. DISTINCT).
    AST firstChild = getFirstSelectExpression();
    AST parent = this;
    ArrayList list = new ArrayList( parent.getNumberOfChildren() );
    for ( AST n = firstChild; n != null; n = n.getNextSibling() ) {
        if ( n instanceof SelectExpression ) {
            list.add( n );
        }
        else {
            throw new IllegalStateException( "Unexpected AST: " + n.getClass().getName() + " " + new ASTPrinter( SqlTokenTypes.class ).showAsString( n, "" ) );
        }
    }
    return ( SelectExpression[] ) list.toArray( new SelectExpression[list.size()] );
}

n=n.getNextSibbling() が何らかの形で group_concat を台無しにしているようですが、これは antlr パッケージからのものであるため、奇妙です。

とにかく、私は立ち往生しており、group_concat(またはgormを使用したgrailsの他のdb固有の関数)をどのように使用できるか興味があります. 私はgrails 2.0.4を使用しています

4

1 に答える 1

0

次のようなことを試してください:

Yourdomain.withSession{ session ->  
   session.createSQLQuery(yourQueryWithGroup_concat).setLong(yourParameterName,yourParameterValue).list()  
}
于 2013-09-12T13:23:44.157 に答える