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を使用しています