当前位置: 首页 > 知识库问答 >
问题:

如何用Gorm在Grails中使用GROUP_CONCAT

隗锐进
2023-03-14

我需要在Grails中使用GROUP_CONCAT聚合函数,最好来自HQL,但也可以使用标准。

我有以下疑问:

ClickTracking.executeQuery("SELECT pageId, containerId, GROUP_CONCAT(clicks) as click" +
                                            "FROM  ClickTracking " +
                                            "WHERE pageId =  ? " +
                                            "GROUP BY containerId ", [pageId])
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 {
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:'expr list'-[DOT]dotnode:'clicktrack0_.clicks'{propertyname=clicks,dereferencetype=all,propertyath=clicks,path={synthet-alias}.clicks,tablealias=clicktrack0_,‘{OriginalText=clicks}.Stacktrace如下:消息:node:org.hibernate.hql.ast.tree.methodnode-[METHOD_CALL]methodnode:'('+-[METHOD_NAME]identnode:'group_concat’{OriginalText=group_concat}-[EXPR_LIST]sqlnode:'expr list‘-[DOT]dotnode:'clicktrack0_.clicks’{propertyname=clicks,ent]identNode:'{合成-别名}‘{OriginalText={合成-别名}}-[IDENT]identNode:'clicks'{OriginalText=Clicks}

Line | Method

如果我设置了一个断点,并查看grailsapplication.getMainContext().getBean(“&sessionFactory”).配置,我可以在其中找到一个名为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(或grails中任何其他特定于db的html" target="_blank">函数和gorm)。我使用的是grails 2.0.4

共有1个答案

狄雅珺
2023-03-14

尝试如下所示:

Yourdomain.withSession{ session ->  
   session.createSQLQuery(yourQueryWithGroup_concat).setLong(yourParameterName,yourParameterValue).list()  
}
 类似资料:
  • 我使用的是Grails DetachedCriteria查询,需要在降序排序时获取最后排序的空值。这是针对Oracle数据库的。 根据我到目前为止所做的研究,Hibernate中没有对此的直接支持,因此Grails中也没有: Grails/Hibernate:如何按isnull(属性)排序以最后获得null? 和 https://hibernate.atlassian.net/browse/HHH

  • 问题内容: 有什么方法可以在Grails / Gorm中使用懒惰属性获取?像这样 @Basic(提取= FetchType.LAZY) 注释(它也适用于左连接获取吗?) (例如,延迟加载String属性) 问题答案: 这个问题被问Grails的用户邮件列表在这里。讨论了几个不同的选项。

  • 找到了以下场景的部分答案,但需要进一步澄清。 有下列情况: 用java编写的域类 我想做的事情: 创建一个grails应用程序,它可以执行以下操作: 使用java域类作为grails域类 通过GORM将java域类映射到DB 能够从groovy域类创建java域类,以便能够将其发送到java服务器进行处理,然后接收java类响应并将其转换为groovy类,以便使用GORM存储在DB中映射 基本上有

  • 问题内容: 我有一个表,其中包含需要根据一组条件定期清除的记录。 我期望我可以使用条件构建器来删除记录,但这失败了,因为条件上没有方法… 所以我想也许我先查询一下集合,然后删除那个… 由于相同的原因,不同的对象,这也会失败。 那么正确的方法是什么呢?我似乎不得不遍历每个项目所调用的整个结果集,这是多余的(不正当的)。 我知道我可以形成一个查询来直接在HQL或SQL中执行,但这也感觉不对。条件构建器

  • 问题内容: 我正在编写一个小型Grails应用程序,并且在运行以下相当简单的代码时,我继续获得StaleObjectStateException:s约占“ createfoo”调用的1/10:th。很可能我错过了使用GORM的最佳方法。 这是代码: 我对GORM最佳做法的疑问: “ if-validate()-then-save()-else-discard()”是否是在GORM中持久保存新对象的

  • 问题内容: 我正在尝试在GORM中定义树结构。这是我的模型: 插入似乎可以正常工作,但是当我无法加载具有多个级别和子级别的Tree时。我想我在关系中错过了一些东西:-树应该引用rootLevel(以及可选地引用所有子级别)-一个级别应该引用其父级别,其子级别和全局父树 您能指出我正确的方向以获得这样的树结构吗?谢谢 问题答案: 我最终得到了这个解决方案(感谢朋友): 和 我错过了Tree和Leve